projects
/
dos_auplay
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
ui cleanup
[dos_auplay]
/
src
/
au_sb.c
diff --git
a/src/au_sb.c
b/src/au_sb.c
index
06f862a
..
63fb49d
100644
(file)
--- a/
src/au_sb.c
+++ b/
src/au_sb.c
@@
-63,6
+63,11
@@
#define MIX_SB16_VOICE_R 0x33
\r
#define MIX_SB16_IRQ_SEL 0x80
\r
#define MIX_SB16_DMA_SEL 0x81
\r
#define MIX_SB16_VOICE_R 0x33
\r
#define MIX_SB16_IRQ_SEL 0x80
\r
#define MIX_SB16_DMA_SEL 0x81
\r
+#define MIX_SB16_INTSTAT 0x82
\r
+
\r
+#define INTSTAT_DMA8 0x01
\r
+#define INTSTAT_DMA16 0x02
\r
+#define INTSTAT_MPU401 0x04
\r
\r
#define VER_MAJOR(x) ((x) >> 8)
\r
#define VER_MINOR(x) ((x) & 0xff)
\r
\r
#define VER_MAJOR(x) ((x) >> 8)
\r
#define VER_MINOR(x) ((x) & 0xff)
\r
@@
-87,7
+92,7
@@
static void start_dsp4(int bits, unsigned int mode, int num_samples);
static void start_dsp(int nchan, int num_samples);
\r
static void write_dsp(unsigned char val);
\r
static unsigned char read_dsp(void);
\r
static void start_dsp(int nchan, int num_samples);
\r
static void write_dsp(unsigned char val);
\r
static unsigned char read_dsp(void);
\r
-static void write_mix(unsigned char val, int reg);
\r
+static void write_mix(int reg, unsigned char val);
\r
static unsigned char read_mix(int reg);
\r
static int get_dsp_version(void);
\r
static int dsp4_detect_irq(void);
\r
static unsigned char read_mix(int reg);
\r
static int get_dsp_version(void);
\r
static int dsp4_detect_irq(void);
\r
@@
-219,16
+224,12
@@
static void start(int rate, int bits, int nchan)
return;
\r
}
\r
\r
return;
\r
}
\r
\r
- printf("DBG allocated seg: %x, addr: %lx\n", (unsigned int)seg,
\r
- (unsigned long)seg << 4);
\r
-
\r
addr = (uint32_t)seg << 4;
\r
next64k = (addr + 0x10000) & 0xffff0000;
\r
if(next64k - addr < BUFSIZE) {
\r
addr = next64k;
\r
}
\r
\r
addr = (uint32_t)seg << 4;
\r
next64k = (addr + 0x10000) & 0xffff0000;
\r
if(next64k - addr < BUFSIZE) {
\r
addr = next64k;
\r
}
\r
\r
- printf("DBG aligned: %lx (mid: %lx)\n", (unsigned long)addr, (unsigned long)(addr + BUFSIZE / 2));
\r
buffer[0] = (void*)addr;
\r
buffer[1] = (void*)(addr + BUFSIZE / 2);
\r
wrbuf = 0;
\r
buffer[0] = (void*)addr;
\r
buffer[1] = (void*)(addr + BUFSIZE / 2);
\r
wrbuf = 0;
\r
@@
-329,11
+330,11
@@
static void setvolume(int ctl, int vol)
/* DSP 4.x - SB16 */
\r
val = vol & 0xf8;
\r
if(ctl == AUDIO_PCM) {
\r
/* DSP 4.x - SB16 */
\r
val = vol & 0xf8;
\r
if(ctl == AUDIO_PCM) {
\r
- write_mix(MIX_SB16_VOICE_L, vol);
\r
- write_mix(MIX_SB16_VOICE_R, vol);
\r
+ write_mix(MIX_SB16_VOICE_L, val);
\r
+ write_mix(MIX_SB16_VOICE_R, val);
\r
} else {
\r
} else {
\r
- write_mix(MIX_SB16_MASTER_L, vol);
\r
- write_mix(MIX_SB16_MASTER_R, vol);
\r
+ write_mix(MIX_SB16_MASTER_L, val);
\r
+ write_mix(MIX_SB16_MASTER_R, val);
\r
}
\r
\r
} else if(VER_MAJOR(dsp_ver) >= 3) {
\r
}
\r
\r
} else if(VER_MAJOR(dsp_ver) >= 3) {
\r
@@
-376,9
+377,9
@@
static int getvolume(int ctl)
}
\r
\r
val = read_mix(lreg);
\r
}
\r
\r
val = read_mix(lreg);
\r
- left = (val & 0xf8) | ((val >> 3) & 7); /* duplicate last 3 bits */
\r
+ left = (val & 0xf8) | (val >> 5);
\r
val = read_mix(rreg);
\r
val = read_mix(rreg);
\r
- right = (val & 0xf8) | ((val >> 3) & 7);
\r
+ right = (val & 0xf8) | (val >> 5);
\r
\r
} else if(VER_MAJOR(dsp_ver) >= 3) {
\r
/* DSP 3.x - SBPro */
\r
\r
} else if(VER_MAJOR(dsp_ver) >= 3) {
\r
/* DSP 3.x - SBPro */
\r
@@
-425,14
+426,10
@@
static void INTERRUPT intr_handler()
if(cur_bits == 8) {
\r
inp(REG_INTACK);
\r
} else {
\r
if(cur_bits == 8) {
\r
inp(REG_INTACK);
\r
} else {
\r
- /*
\r
- unsigned char istat;
\r
- outp(REG_MIXPORT, 0x82);
\r
- istat = inp(REG_MIXDATA);
\r
- if(istat & 2) {
\r
- */
\r
+ unsigned char istat = read_mix(MIX_SB16_INTSTAT);
\r
+ if(istat & INTSTAT_DMA16) {
\r
inp(REG_INT16ACK);
\r
inp(REG_INT16ACK);
\r
- //}
\r
+ }
\r
}
\r
\r
if(irq > 7) {
\r
}
\r
\r
if(irq > 7) {
\r
@@
-453,7
+450,7
@@
static unsigned char read_dsp(void)
return inp(REG_RDATA);
\r
}
\r
\r
return inp(REG_RDATA);
\r
}
\r
\r
-static void write_mix(unsigned char val, int reg)
\r
+static void write_mix(int reg, unsigned char val)
\r
{
\r
outp(REG_MIXPORT, reg);
\r
outp(REG_MIXDATA, val);
\r
{
\r
outp(REG_MIXPORT, reg);
\r
outp(REG_MIXDATA, val);
\r
@@
-491,7
+488,7
@@
static int dsp4_detect_irq(void)
}
\r
if(!irq) {
\r
/* try to force IRQ 5 */
\r
}
\r
if(!irq) {
\r
/* try to force IRQ 5 */
\r
- write_mix(2, MIX_SB16_IRQ_SEL); /* bit1 selects irq 5 */
\r
+ write_mix(MIX_SB16_IRQ_SEL, 2); /* bit1 selects irq 5 */
\r
\r
/* re-read to verify */
\r
irqsel = read_mix(MIX_SB16_IRQ_SEL);
\r
\r
/* re-read to verify */
\r
irqsel = read_mix(MIX_SB16_IRQ_SEL);
\r
@@
-534,7
+531,7
@@
static int dsp4_detect_dma(void)
}
\r
\r
if(dma_chan == -1 || dma16_chan == -1) {
\r
}
\r
\r
if(dma_chan == -1 || dma16_chan == -1) {
\r
- write_mix(dmasel, MIX_SB16_DMA_SEL);
\r
+ write_mix(MIX_SB16_DMA_SEL, dmasel);
\r
\r
/* re-read to verify */
\r
tmp = read_mix(MIX_SB16_DMA_SEL);
\r
\r
/* re-read to verify */
\r
tmp = read_mix(MIX_SB16_DMA_SEL);
\r