4 * Device file manager for /dev/audio
8 * Copyright (C) by Hannu Savolainen 1993-1997
10 * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
11 * Version 2 (June 1991). See the "COPYING" file distributed with this software
15 * Thomas Sailer : ioctl code reworked (vmalloc/vfree removed)
16 * Thomas Sailer : moved several static variables into struct audio_operations
17 * (which is grossly misnamed btw.) because they have the same
18 * lifetime as the rest in there and dynamic allocation saves
20 * Thomas Sailer : use more logical O_NONBLOCK semantics
21 * Daniel Rodriksson: reworked the use of the device specific copy_user
23 * Horst von Brand: Add missing #include <linux/string.h>
24 * Chris Rankin : Update the module-usage counter for the coprocessor,
25 * and decrement the counters again if we cannot open
29 #include <linux/stddef.h>
30 #include <linux/string.h>
31 #include <linux/kmod.h>
33 #include "sound_config.h"
38 #define NEUTRAL16 0x00
41 static int dma_ioctl(int dev
, unsigned int cmd
, void __user
*arg
);
43 static int set_format(int dev
, int fmt
)
45 if (fmt
!= AFMT_QUERY
)
47 audio_devs
[dev
]->local_conversion
= 0;
49 if (!(audio_devs
[dev
]->format_mask
& fmt
)) /* Not supported */
51 if (fmt
== AFMT_MU_LAW
)
54 audio_devs
[dev
]->local_conversion
= CNV_MU_LAW
;
57 fmt
= AFMT_U8
; /* This is always supported */
59 audio_devs
[dev
]->audio_format
= audio_devs
[dev
]->d
->set_bits(dev
, fmt
);
60 audio_devs
[dev
]->local_format
= fmt
;
63 return audio_devs
[dev
]->local_format
;
65 if (audio_devs
[dev
]->local_conversion
)
66 return audio_devs
[dev
]->local_conversion
;
68 return audio_devs
[dev
]->local_format
;
71 int audio_open(int dev
, struct file
*file
)
75 int dev_type
= dev
& 0x0f;
76 int mode
= translate_mode(file
);
77 const struct audio_driver
*driver
;
78 const struct coproc_operations
*coprocessor
;
82 if (dev_type
== SND_DEV_DSP16
)
87 if (dev
< 0 || dev
>= num_audiodevs
)
90 driver
= audio_devs
[dev
]->d
;
92 if (!try_module_get(driver
->owner
))
95 if ((ret
= DMAbuf_open(dev
, mode
)) < 0)
98 if ( (coprocessor
= audio_devs
[dev
]->coproc
) != NULL
) {
99 if (!try_module_get(coprocessor
->owner
))
102 if ((ret
= coprocessor
->open(coprocessor
->devc
, COPR_PCM
)) < 0) {
103 printk(KERN_WARNING
"Sound: Can't access coprocessor device\n");
108 audio_devs
[dev
]->local_conversion
= 0;
110 if (dev_type
== SND_DEV_AUDIO
)
111 set_format(dev
, AFMT_MU_LAW
);
113 set_format(dev
, bits
);
115 audio_devs
[dev
]->audio_mode
= AM_NONE
;
120 * Clean-up stack: this is what needs (un)doing if
121 * we can't open the audio device ...
124 module_put(coprocessor
->owner
);
127 DMAbuf_release(dev
, mode
);
130 module_put(driver
->owner
);
135 static void sync_output(int dev
)
139 struct dma_buffparms
*dmap
= audio_devs
[dev
]->dmap_out
;
141 if (dmap
->fragment_size
<= 0)
143 dmap
->flags
|= DMA_POST
;
145 /* Align the write pointer with fragment boundaries */
147 if ((l
= dmap
->user_counter
% dmap
->fragment_size
) > 0)
150 unsigned long offs
= dmap
->user_counter
% dmap
->bytes_in_use
;
152 len
= dmap
->fragment_size
- l
;
153 memset(dmap
->raw_buf
+ offs
, dmap
->neutral_byte
, len
);
154 DMAbuf_move_wrpointer(dev
, len
);
158 * Clean all unused buffer fragments.
162 dmap
->flags
|= DMA_POST
;
164 for (i
= dmap
->qlen
+ 1; i
< dmap
->nbufs
; i
++)
166 p
= (p
+ 1) % dmap
->nbufs
;
167 if (((dmap
->raw_buf
+ p
* dmap
->fragment_size
) + dmap
->fragment_size
) >
168 (dmap
->raw_buf
+ dmap
->buffsize
))
169 printk(KERN_ERR
"audio: Buffer error 2\n");
171 memset(dmap
->raw_buf
+ p
* dmap
->fragment_size
,
173 dmap
->fragment_size
);
176 dmap
->flags
|= DMA_DIRTY
;
179 void audio_release(int dev
, struct file
*file
)
181 const struct coproc_operations
*coprocessor
;
182 int mode
= translate_mode(file
);
187 * We do this in DMAbuf_release(). Why are we doing it
188 * here? Why don't we test the file mode before setting
189 * both flags? DMAbuf_release() does.
190 * ...pester...pester...pester...
192 audio_devs
[dev
]->dmap_out
->closing
= 1;
193 audio_devs
[dev
]->dmap_in
->closing
= 1;
196 * We need to make sure we allocated the dmap_out buffer
197 * before we go mucking around with it in sync_output().
199 if (mode
& OPEN_WRITE
)
202 if ( (coprocessor
= audio_devs
[dev
]->coproc
) != NULL
) {
203 coprocessor
->close(coprocessor
->devc
, COPR_PCM
);
204 module_put(coprocessor
->owner
);
206 DMAbuf_release(dev
, mode
);
208 module_put(audio_devs
[dev
]->d
->owner
);
211 static void translate_bytes(const unsigned char *table
, unsigned char *buff
, int n
)
218 for (i
= 0; i
< n
; ++i
)
219 buff
[i
] = table
[buff
[i
]];
222 int audio_write(int dev
, struct file
*file
, const char __user
*buf
, int count
)
224 int c
, p
, l
, buf_size
, used
, returned
;
236 if (!(audio_devs
[dev
]->open_mode
& OPEN_WRITE
))
239 if (audio_devs
[dev
]->flags
& DMA_DUPLEX
)
240 audio_devs
[dev
]->audio_mode
|= AM_WRITE
;
242 audio_devs
[dev
]->audio_mode
= AM_WRITE
;
244 if (!count
) /* Flush output */
252 if ((err
= DMAbuf_getwrbuffer(dev
, &dma_buf
, &buf_size
, !!(file
->f_flags
& O_NONBLOCK
))) < 0)
254 /* Handle nonblocking mode */
255 if ((file
->f_flags
& O_NONBLOCK
) && err
== -EAGAIN
)
256 return p
? p
: -EAGAIN
; /* No more space. Return # of accepted bytes */
266 if (!audio_devs
[dev
]->d
->copy_user
)
269 (audio_devs
[dev
]->dmap_out
->raw_buf
+ audio_devs
[dev
]->dmap_out
->buffsize
))
271 printk(KERN_ERR
"audio: Buffer error 3 (%lx,%d), (%lx, %d)\n", (long) dma_buf
, l
, (long) audio_devs
[dev
]->dmap_out
->raw_buf
, (int) audio_devs
[dev
]->dmap_out
->buffsize
);
274 if (dma_buf
< audio_devs
[dev
]->dmap_out
->raw_buf
)
276 printk(KERN_ERR
"audio: Buffer error 13 (%lx<%lx)\n", (long) dma_buf
, (long) audio_devs
[dev
]->dmap_out
->raw_buf
);
279 if(copy_from_user(dma_buf
, &(buf
)[p
], l
))
282 else audio_devs
[dev
]->d
->copy_user (dev
,
290 if (audio_devs
[dev
]->local_conversion
& CNV_MU_LAW
)
292 translate_bytes(ulaw_dsp
, (unsigned char *) dma_buf
, l
);
296 DMAbuf_move_wrpointer(dev
, l
);
303 int audio_read(int dev
, struct file
*file
, char __user
*buf
, int count
)
313 if (!(audio_devs
[dev
]->open_mode
& OPEN_READ
))
316 if ((audio_devs
[dev
]->audio_mode
& AM_WRITE
) && !(audio_devs
[dev
]->flags
& DMA_DUPLEX
))
319 if (audio_devs
[dev
]->flags
& DMA_DUPLEX
)
320 audio_devs
[dev
]->audio_mode
|= AM_READ
;
322 audio_devs
[dev
]->audio_mode
= AM_READ
;
326 if ((buf_no
= DMAbuf_getrdbuffer(dev
, &dmabuf
, &l
, !!(file
->f_flags
& O_NONBLOCK
))) < 0)
329 * Nonblocking mode handling. Return current # of bytes
332 if (p
> 0) /* Avoid throwing away data */
333 return p
; /* Return it instead */
335 if ((file
->f_flags
& O_NONBLOCK
) && buf_no
== -EAGAIN
)
344 * Insert any local processing here.
347 if (audio_devs
[dev
]->local_conversion
& CNV_MU_LAW
)
349 translate_bytes(dsp_ulaw
, (unsigned char *) dmabuf
, l
);
353 char *fixit
= dmabuf
;
355 if(copy_to_user(&(buf
)[p
], fixit
, l
))
359 DMAbuf_rmchars(dev
, buf_no
, l
);
368 int audio_ioctl(int dev
, struct file
*file
, unsigned int cmd
, void __user
*arg
)
372 struct dma_buffparms
*dmap
;
377 if (_IOC_TYPE(cmd
) == 'C') {
378 if (audio_devs
[dev
]->coproc
) /* Coprocessor ioctl */
379 return audio_devs
[dev
]->coproc
->ioctl(audio_devs
[dev
]->coproc
->devc
, cmd
, arg
, 0);
381 printk(KERN_DEBUG"/dev/dsp%d: No coprocessor for this device\n", dev); */
386 case SNDCTL_DSP_SYNC
:
387 if (!(audio_devs
[dev
]->open_mode
& OPEN_WRITE
))
389 if (audio_devs
[dev
]->dmap_out
->fragment_size
== 0)
396 case SNDCTL_DSP_POST
:
397 if (!(audio_devs
[dev
]->open_mode
& OPEN_WRITE
))
399 if (audio_devs
[dev
]->dmap_out
->fragment_size
== 0)
401 audio_devs
[dev
]->dmap_out
->flags
|= DMA_POST
| DMA_DIRTY
;
403 dma_ioctl(dev
, SNDCTL_DSP_POST
, NULL
);
406 case SNDCTL_DSP_RESET
:
407 audio_devs
[dev
]->audio_mode
= AM_NONE
;
411 case SNDCTL_DSP_GETFMTS
:
412 val
= audio_devs
[dev
]->format_mask
| AFMT_MU_LAW
;
415 case SNDCTL_DSP_SETFMT
:
416 if (get_user(val
, p
))
418 val
= set_format(dev
, val
);
421 case SNDCTL_DSP_GETISPACE
:
422 if (!(audio_devs
[dev
]->open_mode
& OPEN_READ
))
424 if ((audio_devs
[dev
]->audio_mode
& AM_WRITE
) && !(audio_devs
[dev
]->flags
& DMA_DUPLEX
))
426 return dma_ioctl(dev
, cmd
, arg
);
428 case SNDCTL_DSP_GETOSPACE
:
429 if (!(audio_devs
[dev
]->open_mode
& OPEN_WRITE
))
431 if ((audio_devs
[dev
]->audio_mode
& AM_READ
) && !(audio_devs
[dev
]->flags
& DMA_DUPLEX
))
433 return dma_ioctl(dev
, cmd
, arg
);
435 case SNDCTL_DSP_NONBLOCK
:
436 file
->f_flags
|= O_NONBLOCK
;
439 case SNDCTL_DSP_GETCAPS
:
440 val
= 1 | DSP_CAP_MMAP
; /* Revision level of this ioctl() */
441 if (audio_devs
[dev
]->flags
& DMA_DUPLEX
&&
442 audio_devs
[dev
]->open_mode
== OPEN_READWRITE
)
443 val
|= DSP_CAP_DUPLEX
;
444 if (audio_devs
[dev
]->coproc
)
445 val
|= DSP_CAP_COPROC
;
446 if (audio_devs
[dev
]->d
->local_qlen
) /* Device has hidden buffers */
447 val
|= DSP_CAP_BATCH
;
448 if (audio_devs
[dev
]->d
->trigger
) /* Supports SETTRIGGER */
449 val
|= DSP_CAP_TRIGGER
;
452 case SOUND_PCM_WRITE_RATE
:
453 if (get_user(val
, p
))
455 val
= audio_devs
[dev
]->d
->set_speed(dev
, val
);
458 case SOUND_PCM_READ_RATE
:
459 val
= audio_devs
[dev
]->d
->set_speed(dev
, 0);
462 case SNDCTL_DSP_STEREO
:
463 if (get_user(val
, p
))
465 if (val
> 1 || val
< 0)
467 val
= audio_devs
[dev
]->d
->set_channels(dev
, val
+ 1) - 1;
470 case SOUND_PCM_WRITE_CHANNELS
:
471 if (get_user(val
, p
))
473 val
= audio_devs
[dev
]->d
->set_channels(dev
, val
);
476 case SOUND_PCM_READ_CHANNELS
:
477 val
= audio_devs
[dev
]->d
->set_channels(dev
, 0);
480 case SOUND_PCM_READ_BITS
:
481 val
= audio_devs
[dev
]->d
->set_bits(dev
, 0);
484 case SNDCTL_DSP_SETDUPLEX
:
485 if (audio_devs
[dev
]->open_mode
!= OPEN_READWRITE
)
487 return (audio_devs
[dev
]->flags
& DMA_DUPLEX
) ? 0 : -EIO
;
489 case SNDCTL_DSP_PROFILE
:
490 if (get_user(val
, p
))
492 if (audio_devs
[dev
]->open_mode
& OPEN_WRITE
)
493 audio_devs
[dev
]->dmap_out
->applic_profile
= val
;
494 if (audio_devs
[dev
]->open_mode
& OPEN_READ
)
495 audio_devs
[dev
]->dmap_in
->applic_profile
= val
;
498 case SNDCTL_DSP_GETODELAY
:
499 dmap
= audio_devs
[dev
]->dmap_out
;
500 if (!(audio_devs
[dev
]->open_mode
& OPEN_WRITE
))
502 if (!(dmap
->flags
& DMA_ALLOC_DONE
))
508 spin_lock_irqsave(&dmap
->lock
,flags
);
509 /* Compute number of bytes that have been played */
510 count
= DMAbuf_get_buffer_pointer (dev
, dmap
, DMODE_OUTPUT
);
511 if (count
< dmap
->fragment_size
&& dmap
->qhead
!= 0)
512 count
+= dmap
->bytes_in_use
; /* Pointer wrap not handled yet */
513 count
+= dmap
->byte_counter
;
515 /* Substract current count from the number of bytes written by app */
516 count
= dmap
->user_counter
- count
;
519 spin_unlock_irqrestore(&dmap
->lock
,flags
);
524 return dma_ioctl(dev
, cmd
, arg
);
526 return put_user(val
, p
);
529 void audio_init_devices(void)
532 * NOTE! This routine could be called several times during boot.
536 void reorganize_buffers(int dev
, struct dma_buffparms
*dmap
, int recording
)
539 * This routine breaks the physical device buffers to logical ones.
542 struct audio_operations
*dsp_dev
= audio_devs
[dev
];
545 unsigned sr
, nc
, sz
, bsz
;
547 sr
= dsp_dev
->d
->set_speed(dev
, 0);
548 nc
= dsp_dev
->d
->set_channels(dev
, 0);
549 sz
= dsp_dev
->d
->set_bits(dev
, 0);
552 dmap
->neutral_byte
= NEUTRAL8
;
554 dmap
->neutral_byte
= NEUTRAL16
;
556 if (sr
< 1 || nc
< 1 || sz
< 1)
558 /* printk(KERN_DEBUG "Warning: Invalid PCM parameters[%d] sr=%d, nc=%d, sz=%d\n", dev, sr, nc, sz);*/
559 sr
= DSP_DEFAULT_SPEED
;
566 sz
/= 8; /* #bits -> #bytes */
567 dmap
->data_rate
= sz
;
569 if (!dmap
->needs_reorg
)
571 dmap
->needs_reorg
= 0;
573 if (dmap
->fragment_size
== 0)
575 /* Compute the fragment size using the default algorithm */
578 * Compute a buffer size for time not exceeding 1 second.
579 * Usually this algorithm gives a buffer size for 0.5 to 1.0 seconds
580 * of sound (using the current speed, sample size and #channels).
583 bsz
= dmap
->buffsize
;
587 if (bsz
== dmap
->buffsize
)
588 bsz
/= 2; /* Needs at least 2 buffers */
591 * Split the computed fragment to smaller parts. After 3.5a9
592 * the default subdivision is 4 which should give better
593 * results when recording.
596 if (dmap
->subdivision
== 0) /* Not already set */
598 dmap
->subdivision
= 4; /* Init to the default value */
600 if ((bsz
/ dmap
->subdivision
) > 4096)
601 dmap
->subdivision
*= 2;
602 if ((bsz
/ dmap
->subdivision
) < 4096)
603 dmap
->subdivision
= 1;
605 bsz
/= dmap
->subdivision
;
608 bsz
= 16; /* Just a sanity check */
610 dmap
->fragment_size
= bsz
;
615 * The process has specified the buffer size with SNDCTL_DSP_SETFRAGMENT or
616 * the buffer size computation has already been done.
618 if (dmap
->fragment_size
> (dmap
->buffsize
/ 2))
619 dmap
->fragment_size
= (dmap
->buffsize
/ 2);
620 bsz
= dmap
->fragment_size
;
623 if (audio_devs
[dev
]->min_fragment
)
624 if (bsz
< (1 << audio_devs
[dev
]->min_fragment
))
625 bsz
= 1 << audio_devs
[dev
]->min_fragment
;
626 if (audio_devs
[dev
]->max_fragment
)
627 if (bsz
> (1 << audio_devs
[dev
]->max_fragment
))
628 bsz
= 1 << audio_devs
[dev
]->max_fragment
;
629 bsz
&= ~0x07; /* Force size which is multiple of 8 bytes */
630 #ifdef OS_DMA_ALIGN_CHECK
631 OS_DMA_ALIGN_CHECK(bsz
);
634 n
= dmap
->buffsize
/ bsz
;
635 if (n
> MAX_SUB_BUFFERS
)
637 if (n
> dmap
->max_fragments
)
638 n
= dmap
->max_fragments
;
646 dmap
->bytes_in_use
= n
* bsz
;
647 dmap
->fragment_size
= bsz
;
648 dmap
->max_byte_counter
= (dmap
->data_rate
* 60 * 60) +
649 dmap
->bytes_in_use
; /* Approximately one hour */
653 memset(dmap
->raw_buf
, dmap
->neutral_byte
, dmap
->bytes_in_use
);
656 for (i
= 0; i
< dmap
->nbufs
; i
++)
661 dmap
->flags
|= DMA_ALLOC_DONE
| DMA_EMPTY
;
664 static int dma_subdivide(int dev
, struct dma_buffparms
*dmap
, int fact
)
668 fact
= dmap
->subdivision
;
673 if (dmap
->subdivision
!= 0 || dmap
->fragment_size
) /* Too late to change */
676 if (fact
> MAX_REALTIME_FACTOR
)
679 if (fact
!= 1 && fact
!= 2 && fact
!= 4 && fact
!= 8 && fact
!= 16)
682 dmap
->subdivision
= fact
;
686 static int dma_set_fragment(int dev
, struct dma_buffparms
*dmap
, int fact
)
693 if (dmap
->subdivision
!= 0 ||
694 dmap
->fragment_size
) /* Too late to change */
697 bytes
= fact
& 0xffff;
698 count
= (fact
>> 16) & 0x7fff;
701 count
= MAX_SUB_BUFFERS
;
702 else if (count
< MAX_SUB_BUFFERS
)
705 if (bytes
< 4 || bytes
> 17) /* <16 || > 512k */
711 if (audio_devs
[dev
]->min_fragment
> 0)
712 if (bytes
< audio_devs
[dev
]->min_fragment
)
713 bytes
= audio_devs
[dev
]->min_fragment
;
715 if (audio_devs
[dev
]->max_fragment
> 0)
716 if (bytes
> audio_devs
[dev
]->max_fragment
)
717 bytes
= audio_devs
[dev
]->max_fragment
;
719 #ifdef OS_DMA_MINBITS
720 if (bytes
< OS_DMA_MINBITS
)
721 bytes
= OS_DMA_MINBITS
;
724 dmap
->fragment_size
= (1 << bytes
);
725 dmap
->max_fragments
= count
;
727 if (dmap
->fragment_size
> dmap
->buffsize
)
728 dmap
->fragment_size
= dmap
->buffsize
;
730 if (dmap
->fragment_size
== dmap
->buffsize
&&
731 audio_devs
[dev
]->flags
& DMA_AUTOMODE
)
732 dmap
->fragment_size
/= 2; /* Needs at least 2 buffers */
734 dmap
->subdivision
= 1; /* Disable SNDCTL_DSP_SUBDIVIDE */
735 return bytes
| ((count
- 1) << 16);
738 static int dma_ioctl(int dev
, unsigned int cmd
, void __user
*arg
)
740 struct dma_buffparms
*dmap_out
= audio_devs
[dev
]->dmap_out
;
741 struct dma_buffparms
*dmap_in
= audio_devs
[dev
]->dmap_in
;
742 struct dma_buffparms
*dmap
;
745 int fact
, ret
, changed
, bits
, count
, err
;
750 case SNDCTL_DSP_SUBDIVIDE
:
752 if (get_user(fact
, (int __user
*)arg
))
754 if (audio_devs
[dev
]->open_mode
& OPEN_WRITE
)
755 ret
= dma_subdivide(dev
, dmap_out
, fact
);
758 if (audio_devs
[dev
]->open_mode
!= OPEN_WRITE
||
759 (audio_devs
[dev
]->flags
& DMA_DUPLEX
&&
760 audio_devs
[dev
]->open_mode
& OPEN_READ
))
761 ret
= dma_subdivide(dev
, dmap_in
, fact
);
766 case SNDCTL_DSP_GETISPACE
:
767 case SNDCTL_DSP_GETOSPACE
:
769 if (cmd
== SNDCTL_DSP_GETISPACE
&& !(audio_devs
[dev
]->open_mode
& OPEN_READ
))
771 if (cmd
== SNDCTL_DSP_GETOSPACE
&& !(audio_devs
[dev
]->open_mode
& OPEN_WRITE
))
773 if (cmd
== SNDCTL_DSP_GETISPACE
&& audio_devs
[dev
]->flags
& DMA_DUPLEX
)
775 if (dmap
->mapping_flags
& DMA_MAP_MAPPED
)
777 if (!(dmap
->flags
& DMA_ALLOC_DONE
))
778 reorganize_buffers(dev
, dmap
, (cmd
== SNDCTL_DSP_GETISPACE
));
779 info
.fragstotal
= dmap
->nbufs
;
780 if (cmd
== SNDCTL_DSP_GETISPACE
)
781 info
.fragments
= dmap
->qlen
;
784 if (!DMAbuf_space_in_queue(dev
))
788 info
.fragments
= DMAbuf_space_in_queue(dev
);
789 if (audio_devs
[dev
]->d
->local_qlen
)
791 int tmp
= audio_devs
[dev
]->d
->local_qlen(dev
);
792 if (tmp
&& info
.fragments
)
794 * This buffer has been counted twice
796 info
.fragments
-= tmp
;
800 if (info
.fragments
< 0)
802 else if (info
.fragments
> dmap
->nbufs
)
803 info
.fragments
= dmap
->nbufs
;
805 info
.fragsize
= dmap
->fragment_size
;
806 info
.bytes
= info
.fragments
* dmap
->fragment_size
;
808 if (cmd
== SNDCTL_DSP_GETISPACE
&& dmap
->qlen
)
809 info
.bytes
-= dmap
->counts
[dmap
->qhead
];
812 info
.fragments
= info
.bytes
/ dmap
->fragment_size
;
813 info
.bytes
-= dmap
->user_counter
% dmap
->fragment_size
;
815 if (copy_to_user(arg
, &info
, sizeof(info
)))
819 case SNDCTL_DSP_SETTRIGGER
:
820 if (get_user(bits
, (int __user
*)arg
))
822 bits
&= audio_devs
[dev
]->open_mode
;
823 if (audio_devs
[dev
]->d
->trigger
== NULL
)
825 if (!(audio_devs
[dev
]->flags
& DMA_DUPLEX
) && (bits
& PCM_ENABLE_INPUT
) &&
826 (bits
& PCM_ENABLE_OUTPUT
))
829 if (bits
& PCM_ENABLE_INPUT
)
831 spin_lock_irqsave(&dmap_in
->lock
,flags
);
832 changed
= (audio_devs
[dev
]->enable_bits
^ bits
) & PCM_ENABLE_INPUT
;
833 if (changed
&& audio_devs
[dev
]->go
)
835 reorganize_buffers(dev
, dmap_in
, 1);
836 if ((err
= audio_devs
[dev
]->d
->prepare_for_input(dev
,
837 dmap_in
->fragment_size
, dmap_in
->nbufs
)) < 0) {
838 spin_unlock_irqrestore(&dmap_in
->lock
,flags
);
841 dmap_in
->dma_mode
= DMODE_INPUT
;
842 audio_devs
[dev
]->enable_bits
|= PCM_ENABLE_INPUT
;
843 DMAbuf_activate_recording(dev
, dmap_in
);
845 audio_devs
[dev
]->enable_bits
&= ~PCM_ENABLE_INPUT
;
846 spin_unlock_irqrestore(&dmap_in
->lock
,flags
);
848 if (bits
& PCM_ENABLE_OUTPUT
)
850 spin_lock_irqsave(&dmap_out
->lock
,flags
);
851 changed
= (audio_devs
[dev
]->enable_bits
^ bits
) & PCM_ENABLE_OUTPUT
;
853 (dmap_out
->mapping_flags
& DMA_MAP_MAPPED
|| dmap_out
->qlen
> 0) &&
856 if (!(dmap_out
->flags
& DMA_ALLOC_DONE
))
857 reorganize_buffers(dev
, dmap_out
, 0);
858 dmap_out
->dma_mode
= DMODE_OUTPUT
;
859 audio_devs
[dev
]->enable_bits
|= PCM_ENABLE_OUTPUT
;
860 dmap_out
->counts
[dmap_out
->qhead
] = dmap_out
->fragment_size
;
861 DMAbuf_launch_output(dev
, dmap_out
);
863 audio_devs
[dev
]->enable_bits
&= ~PCM_ENABLE_OUTPUT
;
864 spin_unlock_irqrestore(&dmap_out
->lock
,flags
);
867 if (changed
&& audio_devs
[dev
]->d
->trigger
)
868 audio_devs
[dev
]->d
->trigger(dev
, bits
* audio_devs
[dev
]->go
);
870 /* Falls through... */
872 case SNDCTL_DSP_GETTRIGGER
:
873 ret
= audio_devs
[dev
]->enable_bits
;
876 case SNDCTL_DSP_SETSYNCRO
:
877 if (!audio_devs
[dev
]->d
->trigger
)
879 audio_devs
[dev
]->d
->trigger(dev
, 0);
880 audio_devs
[dev
]->go
= 0;
883 case SNDCTL_DSP_GETIPTR
:
884 if (!(audio_devs
[dev
]->open_mode
& OPEN_READ
))
886 spin_lock_irqsave(&dmap_in
->lock
,flags
);
887 cinfo
.bytes
= dmap_in
->byte_counter
;
888 cinfo
.ptr
= DMAbuf_get_buffer_pointer(dev
, dmap_in
, DMODE_INPUT
) & ~3;
889 if (cinfo
.ptr
< dmap_in
->fragment_size
&& dmap_in
->qtail
!= 0)
890 cinfo
.bytes
+= dmap_in
->bytes_in_use
; /* Pointer wrap not handled yet */
891 cinfo
.blocks
= dmap_in
->qlen
;
892 cinfo
.bytes
+= cinfo
.ptr
;
893 if (dmap_in
->mapping_flags
& DMA_MAP_MAPPED
)
894 dmap_in
->qlen
= 0; /* Reset interrupt counter */
895 spin_unlock_irqrestore(&dmap_in
->lock
,flags
);
896 if (copy_to_user(arg
, &cinfo
, sizeof(cinfo
)))
900 case SNDCTL_DSP_GETOPTR
:
901 if (!(audio_devs
[dev
]->open_mode
& OPEN_WRITE
))
904 spin_lock_irqsave(&dmap_out
->lock
,flags
);
905 cinfo
.bytes
= dmap_out
->byte_counter
;
906 cinfo
.ptr
= DMAbuf_get_buffer_pointer(dev
, dmap_out
, DMODE_OUTPUT
) & ~3;
907 if (cinfo
.ptr
< dmap_out
->fragment_size
&& dmap_out
->qhead
!= 0)
908 cinfo
.bytes
+= dmap_out
->bytes_in_use
; /* Pointer wrap not handled yet */
909 cinfo
.blocks
= dmap_out
->qlen
;
910 cinfo
.bytes
+= cinfo
.ptr
;
911 if (dmap_out
->mapping_flags
& DMA_MAP_MAPPED
)
912 dmap_out
->qlen
= 0; /* Reset interrupt counter */
913 spin_unlock_irqrestore(&dmap_out
->lock
,flags
);
914 if (copy_to_user(arg
, &cinfo
, sizeof(cinfo
)))
918 case SNDCTL_DSP_GETODELAY
:
919 if (!(audio_devs
[dev
]->open_mode
& OPEN_WRITE
))
921 if (!(dmap_out
->flags
& DMA_ALLOC_DONE
))
926 spin_lock_irqsave(&dmap_out
->lock
,flags
);
927 /* Compute number of bytes that have been played */
928 count
= DMAbuf_get_buffer_pointer (dev
, dmap_out
, DMODE_OUTPUT
);
929 if (count
< dmap_out
->fragment_size
&& dmap_out
->qhead
!= 0)
930 count
+= dmap_out
->bytes_in_use
; /* Pointer wrap not handled yet */
931 count
+= dmap_out
->byte_counter
;
932 /* Substract current count from the number of bytes written by app */
933 count
= dmap_out
->user_counter
- count
;
936 spin_unlock_irqrestore(&dmap_out
->lock
,flags
);
940 case SNDCTL_DSP_POST
:
941 if (audio_devs
[dev
]->dmap_out
->qlen
> 0)
942 if (!(audio_devs
[dev
]->dmap_out
->flags
& DMA_ACTIVE
))
943 DMAbuf_launch_output(dev
, audio_devs
[dev
]->dmap_out
);
946 case SNDCTL_DSP_GETBLKSIZE
:
948 if (audio_devs
[dev
]->open_mode
& OPEN_WRITE
)
949 reorganize_buffers(dev
, dmap_out
, (audio_devs
[dev
]->open_mode
== OPEN_READ
));
950 if (audio_devs
[dev
]->open_mode
== OPEN_READ
||
951 (audio_devs
[dev
]->flags
& DMA_DUPLEX
&&
952 audio_devs
[dev
]->open_mode
& OPEN_READ
))
953 reorganize_buffers(dev
, dmap_in
, (audio_devs
[dev
]->open_mode
== OPEN_READ
));
954 if (audio_devs
[dev
]->open_mode
== OPEN_READ
)
956 ret
= dmap
->fragment_size
;
959 case SNDCTL_DSP_SETFRAGMENT
:
961 if (get_user(fact
, (int __user
*)arg
))
963 if (audio_devs
[dev
]->open_mode
& OPEN_WRITE
)
964 ret
= dma_set_fragment(dev
, dmap_out
, fact
);
967 if (audio_devs
[dev
]->open_mode
== OPEN_READ
||
968 (audio_devs
[dev
]->flags
& DMA_DUPLEX
&&
969 audio_devs
[dev
]->open_mode
& OPEN_READ
))
970 ret
= dma_set_fragment(dev
, dmap_in
, fact
);
973 if (!arg
) /* don't know what this is good for, but preserve old semantics */
978 if (!audio_devs
[dev
]->d
->ioctl
)
980 return audio_devs
[dev
]->d
->ioctl(dev
, cmd
, arg
);
982 return put_user(ret
, (int __user
*)arg
);