4 * Audio routines for Sound Blaster compatible cards.
7 * Copyright (C) by Hannu Savolainen 1993-1997
9 * OSS/Free for Linux is distributed under the GNU GENERAL PUBLIC LICENSE (GPL)
10 * Version 2 (June 1991). See the "COPYING" file distributed with this software
14 * Alan Cox : Formatting and clean ups
17 * Mostly working. Weird uart bug causing irq storms
19 * Daniel J. Rodriksson: Changes to make sb16 work full duplex.
20 * Maybe other 16 bit cards in this code could behave
24 #include <linux/config.h>
25 #include "sound_config.h"
34 int sb_audio_open(int dev
, int mode
)
36 sb_devc
*devc
= audio_devs
[dev
]->devc
;
41 printk(KERN_ERR
"Sound Blaster: incomplete initialization.\n");
44 if (devc
->caps
& SB_NO_RECORDING
&& mode
& OPEN_READ
)
46 if (mode
== OPEN_READ
)
56 if (devc
->dma16
!= -1 && devc
->dma16
!= devc
->dma8
&& !devc
->duplex
)
58 if (sound_open_dma(devc
->dma16
, "Sound Blaster 16 bit"))
67 devc
->irq_mode
= IMODE_NONE
;
68 devc
->irq_mode_16
= IMODE_NONE
;
69 devc
->fullduplex
= devc
->duplex
&&
70 ((mode
& OPEN_READ
) && (mode
& OPEN_WRITE
));
73 /* At first glance this check isn't enough, some ESS chips might not
74 * have a RECLEV. However if they don't common_mixer_set will refuse
75 * cause devc->iomap has no register mapping for RECLEV
77 if (devc
->model
== MDL_ESS
) ess_mixer_reload (devc
, SOUND_MIXER_RECLEV
);
79 /* The ALS007 seems to require that the DSP be removed from the output */
80 /* in order for recording to be activated properly. This is done by */
81 /* setting the appropriate bits of the output control register 4ch to */
82 /* zero. This code assumes that the output control registers are not */
83 /* used anywhere else and therefore the DSP bits are *always* ON for */
84 /* output and OFF for sampling. */
86 if (devc
->submodel
== SUBMDL_ALS007
)
89 sb_setmixer(devc
,ALS007_OUTPUT_CTRL2
,
90 sb_getmixer(devc
,ALS007_OUTPUT_CTRL2
) & 0xf9);
92 sb_setmixer(devc
,ALS007_OUTPUT_CTRL2
,
93 sb_getmixer(devc
,ALS007_OUTPUT_CTRL2
) | 0x06);
98 void sb_audio_close(int dev
)
100 sb_devc
*devc
= audio_devs
[dev
]->devc
;
102 /* fix things if mmap turned off fullduplex */
105 && (devc
->opened
& OPEN_READ
) && (devc
->opened
& OPEN_WRITE
))
107 struct dma_buffparms
*dmap_temp
;
108 dmap_temp
= audio_devs
[dev
]->dmap_out
;
109 audio_devs
[dev
]->dmap_out
= audio_devs
[dev
]->dmap_in
;
110 audio_devs
[dev
]->dmap_in
= dmap_temp
;
112 audio_devs
[dev
]->dmap_out
->dma
= devc
->dma8
;
113 audio_devs
[dev
]->dmap_in
->dma
= ( devc
->duplex
) ?
114 devc
->dma16
: devc
->dma8
;
116 if (devc
->dma16
!= -1 && devc
->dma16
!= devc
->dma8
&& !devc
->duplex
)
117 sound_close_dma(devc
->dma16
);
119 /* For ALS007, turn DSP output back on if closing the device for read */
121 if ((devc
->submodel
== SUBMDL_ALS007
) && (devc
->opened
& OPEN_READ
))
123 sb_setmixer(devc
,ALS007_OUTPUT_CTRL2
,
124 sb_getmixer(devc
,ALS007_OUTPUT_CTRL2
) | 0x06);
129 static void sb_set_output_parms(int dev
, unsigned long buf
, int nr_bytes
,
132 sb_devc
*devc
= audio_devs
[dev
]->devc
;
134 if (!devc
->fullduplex
|| devc
->bits
== AFMT_S16_LE
)
137 devc
->trg_bytes
= nr_bytes
;
138 devc
->trg_intrflag
= intrflag
;
139 devc
->irq_mode
= IMODE_OUTPUT
;
143 devc
->trg_buf_16
= buf
;
144 devc
->trg_bytes_16
= nr_bytes
;
145 devc
->trg_intrflag_16
= intrflag
;
146 devc
->irq_mode_16
= IMODE_OUTPUT
;
150 static void sb_set_input_parms(int dev
, unsigned long buf
, int count
, int intrflag
)
152 sb_devc
*devc
= audio_devs
[dev
]->devc
;
154 if (!devc
->fullduplex
|| devc
->bits
!= AFMT_S16_LE
)
157 devc
->trg_bytes
= count
;
158 devc
->trg_intrflag
= intrflag
;
159 devc
->irq_mode
= IMODE_INPUT
;
163 devc
->trg_buf_16
= buf
;
164 devc
->trg_bytes_16
= count
;
165 devc
->trg_intrflag_16
= intrflag
;
166 devc
->irq_mode_16
= IMODE_INPUT
;
171 * SB1.x compatible routines
174 static void sb1_audio_output_block(int dev
, unsigned long buf
, int nr_bytes
, int intrflag
)
177 int count
= nr_bytes
;
178 sb_devc
*devc
= audio_devs
[dev
]->devc
;
180 /* DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE); */
182 if (audio_devs
[dev
]->dmap_out
->dma
> 3)
186 devc
->irq_mode
= IMODE_OUTPUT
;
190 if (sb_dsp_command(devc
, 0x14)) /* 8 bit DAC using DMA */
192 sb_dsp_command(devc
, (unsigned char) (count
& 0xff));
193 sb_dsp_command(devc
, (unsigned char) ((count
>> 8) & 0xff));
196 printk(KERN_WARNING
"Sound Blaster: unable to start DAC.\n");
197 restore_flags(flags
);
198 devc
->intr_active
= 1;
201 static void sb1_audio_start_input(int dev
, unsigned long buf
, int nr_bytes
, int intrflag
)
204 int count
= nr_bytes
;
205 sb_devc
*devc
= audio_devs
[dev
]->devc
;
208 * Start a DMA input to the buffer pointed by dmaqtail
211 /* DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ); */
213 if (audio_devs
[dev
]->dmap_out
->dma
> 3)
217 devc
->irq_mode
= IMODE_INPUT
;
221 if (sb_dsp_command(devc
, 0x24)) /* 8 bit ADC using DMA */
223 sb_dsp_command(devc
, (unsigned char) (count
& 0xff));
224 sb_dsp_command(devc
, (unsigned char) ((count
>> 8) & 0xff));
227 printk(KERN_ERR
"Sound Blaster: unable to start ADC.\n");
228 restore_flags(flags
);
230 devc
->intr_active
= 1;
233 static void sb1_audio_trigger(int dev
, int bits
)
235 sb_devc
*devc
= audio_devs
[dev
]->devc
;
237 bits
&= devc
->irq_mode
;
240 sb_dsp_command(devc
, 0xd0); /* Halt DMA */
243 switch (devc
->irq_mode
)
246 sb1_audio_start_input(dev
, devc
->trg_buf
, devc
->trg_bytes
,
251 sb1_audio_output_block(dev
, devc
->trg_buf
, devc
->trg_bytes
,
256 devc
->trigger_bits
= bits
;
259 static int sb1_audio_prepare_for_input(int dev
, int bsize
, int bcount
)
261 sb_devc
*devc
= audio_devs
[dev
]->devc
;
266 if (sb_dsp_command(devc
, 0x40))
267 sb_dsp_command(devc
, devc
->tconst
);
268 sb_dsp_command(devc
, DSP_CMD_SPKOFF
);
269 restore_flags(flags
);
271 devc
->trigger_bits
= 0;
275 static int sb1_audio_prepare_for_output(int dev
, int bsize
, int bcount
)
277 sb_devc
*devc
= audio_devs
[dev
]->devc
;
282 if (sb_dsp_command(devc
, 0x40))
283 sb_dsp_command(devc
, devc
->tconst
);
284 sb_dsp_command(devc
, DSP_CMD_SPKON
);
285 restore_flags(flags
);
286 devc
->trigger_bits
= 0;
290 static int sb1_audio_set_speed(int dev
, int speed
)
292 int max_speed
= 23000;
293 sb_devc
*devc
= audio_devs
[dev
]->devc
;
296 if (devc
->opened
& OPEN_READ
)
304 if (speed
> max_speed
)
307 devc
->tconst
= (256 - ((1000000 + speed
/ 2) / speed
)) & 0xff;
308 tmp
= 256 - devc
->tconst
;
309 speed
= (1000000 + tmp
/ 2) / tmp
;
316 static short sb1_audio_set_channels(int dev
, short channels
)
318 sb_devc
*devc
= audio_devs
[dev
]->devc
;
319 return devc
->channels
= 1;
322 static unsigned int sb1_audio_set_bits(int dev
, unsigned int bits
)
324 sb_devc
*devc
= audio_devs
[dev
]->devc
;
325 return devc
->bits
= 8;
328 static void sb1_audio_halt_xfer(int dev
)
331 sb_devc
*devc
= audio_devs
[dev
]->devc
;
336 restore_flags(flags
);
340 * SB 2.0 and SB 2.01 compatible routines
343 static void sb20_audio_output_block(int dev
, unsigned long buf
, int nr_bytes
,
347 int count
= nr_bytes
;
348 sb_devc
*devc
= audio_devs
[dev
]->devc
;
351 /* DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE); */
353 if (audio_devs
[dev
]->dmap_out
->dma
> 3)
357 devc
->irq_mode
= IMODE_OUTPUT
;
361 if (sb_dsp_command(devc
, 0x48)) /* DSP Block size */
363 sb_dsp_command(devc
, (unsigned char) (count
& 0xff));
364 sb_dsp_command(devc
, (unsigned char) ((count
>> 8) & 0xff));
366 if (devc
->speed
* devc
->channels
<= 23000)
367 cmd
= 0x1c; /* 8 bit PCM output */
369 cmd
= 0x90; /* 8 bit high speed PCM output (SB2.01/Pro) */
371 if (!sb_dsp_command(devc
, cmd
))
372 printk(KERN_ERR
"Sound Blaster: unable to start DAC.\n");
375 printk(KERN_ERR
"Sound Blaster: unable to start DAC.\n");
376 restore_flags(flags
);
377 devc
->intr_active
= 1;
380 static void sb20_audio_start_input(int dev
, unsigned long buf
, int nr_bytes
, int intrflag
)
383 int count
= nr_bytes
;
384 sb_devc
*devc
= audio_devs
[dev
]->devc
;
388 * Start a DMA input to the buffer pointed by dmaqtail
391 /* DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ); */
393 if (audio_devs
[dev
]->dmap_out
->dma
> 3)
397 devc
->irq_mode
= IMODE_INPUT
;
401 if (sb_dsp_command(devc
, 0x48)) /* DSP Block size */
403 sb_dsp_command(devc
, (unsigned char) (count
& 0xff));
404 sb_dsp_command(devc
, (unsigned char) ((count
>> 8) & 0xff));
406 if (devc
->speed
* devc
->channels
<= (devc
->major
== 3 ? 23000 : 13000))
407 cmd
= 0x2c; /* 8 bit PCM input */
409 cmd
= 0x98; /* 8 bit high speed PCM input (SB2.01/Pro) */
411 if (!sb_dsp_command(devc
, cmd
))
412 printk(KERN_ERR
"Sound Blaster: unable to start ADC.\n");
415 printk(KERN_ERR
"Sound Blaster: unable to start ADC.\n");
416 restore_flags(flags
);
417 devc
->intr_active
= 1;
420 static void sb20_audio_trigger(int dev
, int bits
)
422 sb_devc
*devc
= audio_devs
[dev
]->devc
;
423 bits
&= devc
->irq_mode
;
426 sb_dsp_command(devc
, 0xd0); /* Halt DMA */
429 switch (devc
->irq_mode
)
432 sb20_audio_start_input(dev
, devc
->trg_buf
, devc
->trg_bytes
,
437 sb20_audio_output_block(dev
, devc
->trg_buf
, devc
->trg_bytes
,
442 devc
->trigger_bits
= bits
;
446 * SB2.01 specific speed setup
449 static int sb201_audio_set_speed(int dev
, int speed
)
451 sb_devc
*devc
= audio_devs
[dev
]->devc
;
453 int s
= speed
* devc
->channels
;
461 if (devc
->opened
& OPEN_READ
&& speed
> 15000)
463 devc
->tconst
= ((65536 - ((256000000 + s
/ 2) / s
)) >> 8) & 0xff;
464 tmp
= 256 - devc
->tconst
;
465 speed
= ((1000000 + tmp
/ 2) / tmp
) / devc
->channels
;
473 * SB Pro specific routines
476 static int sbpro_audio_prepare_for_input(int dev
, int bsize
, int bcount
)
477 { /* For SB Pro and Jazz16 */
478 sb_devc
*devc
= audio_devs
[dev
]->devc
;
480 unsigned char bits
= 0;
482 if (devc
->dma16
>= 0 && devc
->dma16
!= devc
->dma8
)
483 audio_devs
[dev
]->dmap_out
->dma
= audio_devs
[dev
]->dmap_in
->dma
=
484 devc
->bits
== 16 ? devc
->dma16
: devc
->dma8
;
486 if (devc
->model
== MDL_JAZZ
|| devc
->model
== MDL_SMW
)
487 if (devc
->bits
== AFMT_S16_LE
)
488 bits
= 0x04; /* 16 bit mode */
492 if (sb_dsp_command(devc
, 0x40))
493 sb_dsp_command(devc
, devc
->tconst
);
494 sb_dsp_command(devc
, DSP_CMD_SPKOFF
);
495 if (devc
->channels
== 1)
496 sb_dsp_command(devc
, 0xa0 | bits
); /* Mono input */
498 sb_dsp_command(devc
, 0xa8 | bits
); /* Stereo input */
499 restore_flags(flags
);
501 devc
->trigger_bits
= 0;
505 static int sbpro_audio_prepare_for_output(int dev
, int bsize
, int bcount
)
506 { /* For SB Pro and Jazz16 */
507 sb_devc
*devc
= audio_devs
[dev
]->devc
;
510 unsigned char bits
= 0;
512 if (devc
->dma16
>= 0 && devc
->dma16
!= devc
->dma8
)
513 audio_devs
[dev
]->dmap_out
->dma
= audio_devs
[dev
]->dmap_in
->dma
= devc
->bits
== 16 ? devc
->dma16
: devc
->dma8
;
514 if (devc
->model
== MDL_SBPRO
)
515 sb_mixer_set_stereo(devc
, devc
->channels
== 2);
519 if (sb_dsp_command(devc
, 0x40))
520 sb_dsp_command(devc
, devc
->tconst
);
521 sb_dsp_command(devc
, DSP_CMD_SPKON
);
523 if (devc
->model
== MDL_JAZZ
|| devc
->model
== MDL_SMW
)
525 if (devc
->bits
== AFMT_S16_LE
)
526 bits
= 0x04; /* 16 bit mode */
528 if (devc
->channels
== 1)
529 sb_dsp_command(devc
, 0xa0 | bits
); /* Mono output */
531 sb_dsp_command(devc
, 0xa8 | bits
); /* Stereo output */
535 tmp
= sb_getmixer(devc
, 0x0e);
536 if (devc
->channels
== 1)
540 sb_setmixer(devc
, 0x0e, tmp
);
542 restore_flags(flags
);
543 devc
->trigger_bits
= 0;
547 static int sbpro_audio_set_speed(int dev
, int speed
)
549 sb_devc
*devc
= audio_devs
[dev
]->devc
;
557 if (devc
->channels
> 1 && speed
> 22050)
559 sb201_audio_set_speed(dev
, speed
);
564 static short sbpro_audio_set_channels(int dev
, short channels
)
566 sb_devc
*devc
= audio_devs
[dev
]->devc
;
568 if (channels
== 1 || channels
== 2)
570 if (channels
!= devc
->channels
)
572 devc
->channels
= channels
;
573 if (devc
->model
== MDL_SBPRO
&& devc
->channels
== 2)
574 sbpro_audio_set_speed(dev
, devc
->speed
);
577 return devc
->channels
;
580 static int jazz16_audio_set_speed(int dev
, int speed
)
582 sb_devc
*devc
= audio_devs
[dev
]->devc
;
587 int s
= speed
* devc
->channels
;
594 devc
->tconst
= ((65536 - ((256000000 + s
/ 2) / s
)) >> 8) & 0xff;
596 tmp
= 256 - devc
->tconst
;
597 speed
= ((1000000 + tmp
/ 2) / tmp
) / devc
->channels
;
605 * SB16 specific routines
608 static int sb16_audio_set_speed(int dev
, int speed
)
610 sb_devc
*devc
= audio_devs
[dev
]->devc
;
611 int max_speed
= devc
->submodel
== SUBMDL_ALS100
? 48000 : 44100;
615 if (speed
< 5000) /* which of these */
616 speed
= 4000; /* is correct ??? */
618 if (speed
> max_speed
)
626 static unsigned int sb16_audio_set_bits(int dev
, unsigned int bits
)
628 sb_devc
*devc
= audio_devs
[dev
]->devc
;
632 if (bits
== AFMT_U8
|| bits
== AFMT_S16_LE
)
635 devc
->bits
= AFMT_U8
;
641 static int sb16_audio_prepare_for_input(int dev
, int bsize
, int bcount
)
643 sb_devc
*devc
= audio_devs
[dev
]->devc
;
645 if (!devc
->fullduplex
)
647 audio_devs
[dev
]->dmap_out
->dma
=
648 audio_devs
[dev
]->dmap_in
->dma
=
649 devc
->bits
== AFMT_S16_LE
?
650 devc
->dma16
: devc
->dma8
;
652 else if (devc
->bits
== AFMT_S16_LE
)
654 audio_devs
[dev
]->dmap_out
->dma
= devc
->dma8
;
655 audio_devs
[dev
]->dmap_in
->dma
= devc
->dma16
;
659 audio_devs
[dev
]->dmap_out
->dma
= devc
->dma16
;
660 audio_devs
[dev
]->dmap_in
->dma
= devc
->dma8
;
663 devc
->trigger_bits
= 0;
667 static int sb16_audio_prepare_for_output(int dev
, int bsize
, int bcount
)
669 sb_devc
*devc
= audio_devs
[dev
]->devc
;
671 if (!devc
->fullduplex
)
673 audio_devs
[dev
]->dmap_out
->dma
=
674 audio_devs
[dev
]->dmap_in
->dma
=
675 devc
->bits
== AFMT_S16_LE
?
676 devc
->dma16
: devc
->dma8
;
678 else if (devc
->bits
== AFMT_S16_LE
)
680 audio_devs
[dev
]->dmap_out
->dma
= devc
->dma8
;
681 audio_devs
[dev
]->dmap_in
->dma
= devc
->dma16
;
685 audio_devs
[dev
]->dmap_out
->dma
= devc
->dma16
;
686 audio_devs
[dev
]->dmap_in
->dma
= devc
->dma8
;
689 devc
->trigger_bits
= 0;
693 static void sb16_audio_output_block(int dev
, unsigned long buf
, int count
,
696 unsigned long flags
, cnt
;
697 sb_devc
*devc
= audio_devs
[dev
]->devc
;
700 if (!devc
->fullduplex
|| devc
->bits
== AFMT_S16_LE
)
702 devc
->irq_mode
= IMODE_OUTPUT
;
703 devc
->intr_active
= 1;
707 devc
->irq_mode_16
= IMODE_OUTPUT
;
708 devc
->intr_active_16
= 1;
715 if (devc
->fullduplex
)
716 devc
->bits
= (devc
->bits
== AFMT_S16_LE
) ?
717 AFMT_U8
: AFMT_S16_LE
;
718 restore_flags (flags
);
721 if (devc
->bits
== AFMT_S16_LE
)
728 /* DMAbuf_start_dma (dev, buf, count, DMA_MODE_WRITE); */
730 sb_dsp_command(devc
, 0x41);
731 sb_dsp_command(devc
, (unsigned char) ((devc
->speed
>> 8) & 0xff));
732 sb_dsp_command(devc
, (unsigned char) (devc
->speed
& 0xff));
734 sb_dsp_command(devc
, (devc
->bits
== AFMT_S16_LE
? 0xb6 : 0xc6));
735 sb_dsp_command(devc
, ((devc
->channels
== 2 ? 0x20 : 0) +
736 (devc
->bits
== AFMT_S16_LE
? 0x10 : 0)));
737 sb_dsp_command(devc
, (unsigned char) (cnt
& 0xff));
738 sb_dsp_command(devc
, (unsigned char) (cnt
>> 8));
740 /* restore real value after all programming */
742 restore_flags(flags
);
745 static void sb16_audio_start_input(int dev
, unsigned long buf
, int count
, int intrflag
)
747 unsigned long flags
, cnt
;
748 sb_devc
*devc
= audio_devs
[dev
]->devc
;
750 if (!devc
->fullduplex
|| devc
->bits
!= AFMT_S16_LE
)
752 devc
->irq_mode
= IMODE_INPUT
;
753 devc
->intr_active
= 1;
757 devc
->irq_mode_16
= IMODE_INPUT
;
758 devc
->intr_active_16
= 1;
762 if (devc
->bits
== AFMT_S16_LE
)
769 /* DMAbuf_start_dma (dev, buf, count, DMA_MODE_READ); */
771 sb_dsp_command(devc
, 0x42);
772 sb_dsp_command(devc
, (unsigned char) ((devc
->speed
>> 8) & 0xff));
773 sb_dsp_command(devc
, (unsigned char) (devc
->speed
& 0xff));
775 sb_dsp_command(devc
, (devc
->bits
== AFMT_S16_LE
? 0xbe : 0xce));
776 sb_dsp_command(devc
, ((devc
->channels
== 2 ? 0x20 : 0) +
777 (devc
->bits
== AFMT_S16_LE
? 0x10 : 0)));
778 sb_dsp_command(devc
, (unsigned char) (cnt
& 0xff));
779 sb_dsp_command(devc
, (unsigned char) (cnt
>> 8));
781 restore_flags(flags
);
784 static void sb16_audio_trigger(int dev
, int bits
)
786 sb_devc
*devc
= audio_devs
[dev
]->devc
;
788 int bits_16
= bits
& devc
->irq_mode_16
;
789 bits
&= devc
->irq_mode
;
791 if (!bits
&& !bits_16
)
792 sb_dsp_command(devc
, 0xd0); /* Halt DMA */
797 switch (devc
->irq_mode
)
800 sb16_audio_start_input(dev
,
807 sb16_audio_output_block(dev
,
816 switch (devc
->irq_mode_16
)
819 sb16_audio_start_input(dev
,
822 devc
->trg_intrflag_16
);
826 sb16_audio_output_block(dev
,
829 devc
->trg_intrflag_16
);
835 devc
->trigger_bits
= bits
| bits_16
;
838 static unsigned char lbuf8
[2048];
839 static signed short *lbuf16
= (signed short *)lbuf8
;
840 #define LBUFCOPYSIZE 1024
842 sb16_copy_from_user(int dev
,
843 char *localbuf
, int localoffs
,
844 const char *userbuf
, int useroffs
,
845 int max_in
, int max_out
,
846 int *used
, int *returned
,
849 sb_devc
*devc
= audio_devs
[dev
]->devc
;
850 int i
, c
, p
, locallen
;
854 /* if not duplex no conversion */
855 if (!devc
->fullduplex
)
857 copy_from_user (localbuf
+ localoffs
, userbuf
+ useroffs
, len
);
861 else if (devc
->bits
== AFMT_S16_LE
)
864 /* max_in >> 1, max number of samples in ( 16 bits ) */
865 /* max_out, max number of samples out ( 8 bits ) */
866 /* len, number of samples that will be taken ( 16 bits )*/
867 /* c, count of samples remaining in buffer ( 16 bits )*/
868 /* p, count of samples already processed ( 16 bits )*/
869 len
= ( (max_in
>> 1) > max_out
) ? max_out
: (max_in
>> 1);
872 buf8
= (unsigned char *)(localbuf
+ localoffs
);
875 locallen
= (c
>= LBUFCOPYSIZE
? LBUFCOPYSIZE
: c
);
876 /* << 1 in order to get 16 bit samples */
877 copy_from_user (lbuf16
,
878 userbuf
+useroffs
+ (p
<< 1),
880 for (i
= 0; i
< locallen
; i
++)
882 buf8
[p
+i
] = ~((lbuf16
[i
] >> 8) & 0xff) ^ 0x80;
884 c
-= locallen
; p
+= locallen
;
886 /* used = ( samples * 16 bits size ) */
888 /* returned = ( samples * 8 bits size ) */
894 /* max_in, max number of samples in ( 8 bits ) */
895 /* max_out >> 1, max number of samples out ( 16 bits ) */
896 /* len, number of samples that will be taken ( 8 bits )*/
897 /* c, count of samples remaining in buffer ( 8 bits )*/
898 /* p, count of samples already processed ( 8 bits )*/
899 len
= max_in
> (max_out
>> 1) ? (max_out
>> 1) : max_in
;
902 buf16
= (signed short *)(localbuf
+ localoffs
);
905 locallen
= (c
>= LBUFCOPYSIZE
? LBUFCOPYSIZE
: c
);
906 copy_from_user (lbuf8
,
907 userbuf
+useroffs
+ p
,
909 for (i
= 0; i
< locallen
; i
++)
911 buf16
[p
+i
] = (~lbuf8
[i
] ^ 0x80) << 8;
913 c
-= locallen
; p
+= locallen
;
915 /* used = ( samples * 8 bits size ) */
917 /* returned = ( samples * 16 bits size ) */
918 *returned
= len
<< 1;
923 sb16_audio_mmap(int dev
)
925 sb_devc
*devc
= audio_devs
[dev
]->devc
;
926 devc
->fullduplex
= 0;
929 static struct audio_driver sb1_audio_driver
= /* SB1.x */
936 sb1_audio_prepare_for_input
,
937 sb1_audio_prepare_for_output
,
939 NULL
, /* local_qlen */
940 NULL
, /* copy_from_user */
946 sb1_audio_set_channels
949 static struct audio_driver sb20_audio_driver
= /* SB2.0 */
956 sb1_audio_prepare_for_input
,
957 sb1_audio_prepare_for_output
,
959 NULL
, /* local_qlen */
960 NULL
, /* copy_from_user */
966 sb1_audio_set_channels
969 static struct audio_driver sb201_audio_driver
= /* SB2.01 */
976 sb1_audio_prepare_for_input
,
977 sb1_audio_prepare_for_output
,
979 NULL
, /* local_qlen */
980 NULL
, /* copy_from_user */
984 sb201_audio_set_speed
,
986 sb1_audio_set_channels
989 static struct audio_driver sbpro_audio_driver
= /* SB Pro */
996 sbpro_audio_prepare_for_input
,
997 sbpro_audio_prepare_for_output
,
999 NULL
, /* local_qlen */
1000 NULL
, /* copy_from_user */
1004 sbpro_audio_set_speed
,
1006 sbpro_audio_set_channels
1009 static struct audio_driver jazz16_audio_driver
= /* Jazz16 and SM Wave */
1013 sb_set_output_parms
,
1016 sbpro_audio_prepare_for_input
,
1017 sbpro_audio_prepare_for_output
,
1018 sb1_audio_halt_xfer
,
1019 NULL
, /* local_qlen */
1020 NULL
, /* copy_from_user */
1024 jazz16_audio_set_speed
,
1025 sb16_audio_set_bits
,
1026 sbpro_audio_set_channels
1029 static struct audio_driver sb16_audio_driver
= /* SB16 */
1033 sb_set_output_parms
,
1036 sb16_audio_prepare_for_input
,
1037 sb16_audio_prepare_for_output
,
1038 sb1_audio_halt_xfer
,
1039 NULL
, /* local_qlen */
1040 sb16_copy_from_user
, /* copy_from_user */
1044 sb16_audio_set_speed
,
1045 sb16_audio_set_bits
,
1046 sbpro_audio_set_channels
,
1052 void sb_audio_init(sb_devc
* devc
, char *name
)
1054 int audio_flags
= 0;
1055 int format_mask
= AFMT_U8
;
1057 struct audio_driver
*driver
= &sb1_audio_driver
;
1059 switch (devc
->model
)
1061 case MDL_SB1
: /* SB1.0 or SB 1.5 */
1062 DDB(printk("Will use standard SB1.x driver\n"));
1063 audio_flags
= DMA_HARDSTOP
;
1067 DDB(printk("Will use SB2.0 driver\n"));
1068 audio_flags
= DMA_AUTOMODE
;
1069 driver
= &sb20_audio_driver
;
1073 DDB(printk("Will use SB2.01 (high speed) driver\n"));
1074 audio_flags
= DMA_AUTOMODE
;
1075 driver
= &sb201_audio_driver
;
1080 DDB(printk("Will use Jazz16 driver\n"));
1081 audio_flags
= DMA_AUTOMODE
;
1082 format_mask
|= AFMT_S16_LE
;
1083 driver
= &jazz16_audio_driver
;
1087 DDB(printk("Will use ESS ES688/1688 driver\n"));
1088 driver
= ess_audio_init (devc
, &audio_flags
, &format_mask
);
1092 DDB(printk("Will use SB16 driver\n"));
1093 audio_flags
= DMA_AUTOMODE
;
1094 format_mask
|= AFMT_S16_LE
;
1095 if (devc
->dma8
!= devc
->dma16
&& devc
->dma16
!= -1)
1097 audio_flags
|= DMA_DUPLEX
;
1100 driver
= &sb16_audio_driver
;
1104 DDB(printk("Will use SB Pro driver\n"));
1105 audio_flags
= DMA_AUTOMODE
;
1106 driver
= &sbpro_audio_driver
;
1109 if ((devc
->dev
= sound_install_audiodrv(AUDIO_DRIVER_VERSION
,
1110 name
,driver
, sizeof(struct audio_driver
),
1111 audio_flags
, format_mask
, devc
,
1113 devc
->duplex
? devc
->dma16
: devc
->dma8
)) < 0)
1115 printk(KERN_ERR
"Sound Blaster: unable to install audio.\n");
1118 audio_devs
[devc
->dev
]->mixer_dev
= devc
->my_mixerdev
;
1119 audio_devs
[devc
->dev
]->min_fragment
= 5;