From 1a385f5cdc52ad58db6d17799aab3177e988a213 Mon Sep 17 00:00:00 2001 From: markm Date: Mon, 10 Nov 1997 18:31:35 +0000 Subject: [PATCH] Fix conflicts. --- sys/i386/isa/sound/ad1848.c | 54 +++++++++----------------------- sys/i386/isa/sound/audio.c | 13 +++++--- sys/i386/isa/sound/dmabuf.c | 13 ++++++-- sys/i386/isa/sound/gus_wave.c | 4 +-- sys/i386/isa/sound/local.h | 11 ++++--- sys/i386/isa/sound/midibuf.c | 33 +++++++++++++++++++ sys/i386/isa/sound/os.h | 2 +- sys/i386/isa/sound/sequencer.c | 37 +++++++++++++++++++++- sys/i386/isa/sound/sound_calls.h | 2 +- sys/i386/isa/sound/soundcard.c | 39 +++++++++++++---------- sys/i386/isa/sound/sscape.c | 4 ++- 11 files changed, 140 insertions(+), 72 deletions(-) diff --git a/sys/i386/isa/sound/ad1848.c b/sys/i386/isa/sound/ad1848.c index 39a0e55c848f..05d77fa36172 100644 --- a/sys/i386/isa/sound/ad1848.c +++ b/sys/i386/isa/sound/ad1848.c @@ -407,7 +407,7 @@ ad1848_mixer_set(ad1848_info * devc, int dev, int value) if (mix_devices[dev][RIGHT_CHN].nbits == 0) /* Mono control */ right = left; - retvol = left | (left << 8); + retvol = left | (right << 8); /* Scale volumes */ left = mix_cvt[left]; @@ -913,12 +913,14 @@ ad1848_prepare_for_IO(int dev, int bsize, int bcount) if (devc->irq_mode) return 0; - flags = splhigh(); fs = devc->speed_bits | (devc->format_bits << 5); if (devc->channels > 1) fs |= 0x10; old_fs = fs; + + flags = splhigh(); + if (devc->mode == MD_1845) { /* Use alternate speed select regs */ fs &= 0xf0; /* Mask off the rate select bits */ @@ -927,6 +929,7 @@ ad1848_prepare_for_IO(int dev, int bsize, int bcount) } ad_enter_MCE(devc); /* Enables changes to the format select reg */ + ad_write(devc, 8, fs); /* @@ -946,36 +949,13 @@ ad1848_prepare_for_IO(int dev, int bsize, int bcount) */ AD_WAIT_INIT(10000); } - ad_leave_MCE(devc); /* Starts the calibration process. */ - /* amancio */ - ad_enter_MCE(devc); /* Enables changes to the format select reg */ - - ad_write(devc, 8, fs); - /* - * Write to I8 starts resyncronization. Wait until it completes. - */ - AD_WAIT_INIT(10000); ad_write(devc, 9, ad_read(devc, 9) & ~0x08); - /* ad_write (devc, 9, ad_read (devc, 9) | 0x08); */ - /* - * If mode == 2 (CS4231), set I28 also. It's the capture format - * register. - */ - if (devc->mode != MD_1848) { - ad_write(devc, 28, fs); + ad_leave_MCE(devc); - /* - * Write to I28 starts resyncronization. Wait until it - * completes. - */ - AD_WAIT_INIT(10000); - } - - ad_leave_MCE(devc); /* Starts the calibration process. */ - /* amancio */ splx(flags); + devc->xfer_count = 0; #ifdef CONFIG_SEQUENCER if (dev == timer_installed && devc->timer_running) @@ -998,31 +978,27 @@ ad1848_halt(int dev) ad1848_info *devc = (ad1848_info *) audio_devs[dev]->devc; u_long flags; int timeout; + flags = splhigh(); ad_mute(devc); - ad_enter_MCE(devc); - ad_write(devc, 9, ad_read(devc, 9) & ~0x03); /* Stop DMA */ - ad_write(devc, 9, ad_read(devc, 9) | 0x8); ad_write(devc, 9, ad_read(devc, 9) & ~0x03); /* Stop DMA */ - /* - * ad_write (devc, 15, 0); Clear DMA counter ad_write (devc, - * 14, 0); Clear DMA counter - */ + + ad_write(devc, 14, 0); /* Clear DMA counter */ + ad_write(devc, 15, 0); /* Clear DMA counter */ if (devc->mode != MD_1848) { ad_write(devc, 30, 0); /* Clear DMA counter */ ad_write(devc, 31, 0); /* Clear DMA counter */ } - for (timeout = 0; timeout < 1000 && !(inb(io_Status(devc)) & 0x80); + + for (timeout = 0; timeout < 1000 && !(inb(io_Status(devc)) & 0x01); timeout++); /* Wait for interrupt */ - ad_write(devc, 9, ad_read(devc, 9) & ~0x03); /* Stop DMA */ - outb(io_Status(devc), 0); /* Clear interrupt status */ outb(io_Status(devc), 0); /* Clear interrupt status */ + devc->irq_mode = 0; - ad_leave_MCE(devc); /* DMAbuf_reset_dma (dev); */ splx(flags); @@ -1499,7 +1475,7 @@ ad1848_init(char *name, int io_base, int irq, irq2dev[-irq] = devc->dev_no = my_dev; audio_devs[my_dev]->otherside = -1 ; - audio_devs[my_dev]->flags = DMA_AUTOMODE | DMA_DUPLEX; + audio_devs[my_dev]->flags |= DMA_AUTOMODE | DMA_DUPLEX; audio_devs[my_dev]->dmachan1 = dma_playback; audio_devs[my_dev]->dmachan2 = dma_capture; audio_devs[my_dev]->buffsize = DSP_BUFFSIZE; diff --git a/sys/i386/isa/sound/audio.c b/sys/i386/isa/sound/audio.c index 8e1a3c8ff810..a48524800d40 100644 --- a/sys/i386/isa/sound/audio.c +++ b/sys/i386/isa/sound/audio.c @@ -36,6 +36,11 @@ #define ON 1 #define OFF 0 +int +DMAbuf_poll(int dev, struct fileinfo * file, int events, select_table * wait); + +int +audio_poll(int dev, struct fileinfo * file, int events, select_table * wait); static int wr_buff_no[MAX_AUDIO_DEV]; /* != -1, if there is a incomplete output block in the queue. */ @@ -426,11 +431,11 @@ audio_ioctl(int dev, struct fileinfo * file, u_int cmd, ioctl_arg arg) } } -#ifdef ALLOW_SELECT - /* +#ifdef ALLOW_POLL +/* * XXX should we use spltty() in the select calls ? - lr970714 * - */ + */ int audio_poll(int dev, struct fileinfo * file, int events, select_table * wait) @@ -459,6 +464,6 @@ audio_poll(int dev, struct fileinfo * file, int events, select_table * wait) } return 0; } -#endif /* ALLOW_SELECT */ +#endif /* ALLOW_POLL */ #endif diff --git a/sys/i386/isa/sound/dmabuf.c b/sys/i386/isa/sound/dmabuf.c index 55b8ff144704..db1824efab15 100644 --- a/sys/i386/isa/sound/dmabuf.c +++ b/sys/i386/isa/sound/dmabuf.c @@ -28,8 +28,17 @@ */ #include +#include #if defined(CONFIG_AUDIO) || defined(CONFIG_GUS) +#ifdef ALLOW_POLL + +int +DMAbuf_poll(int dev, struct fileinfo * file, int events, select_table * wait); +#endif; + +static void +reorganize_buffers(int dev, struct dma_buffparms * dmap); static int *in_sleeper[MAX_AUDIO_DEV] = {NULL}; static volatile struct snd_wait in_sleep_flag[MAX_AUDIO_DEV] = {{0}}; @@ -1379,7 +1388,7 @@ DMAbuf_reset_dma(int dev) { } -#ifdef ALLOW_SELECT +#ifdef ALLOW_POLL int DMAbuf_poll(int dev, struct fileinfo * file, int events, select_table * wait) @@ -1500,7 +1509,7 @@ DMAbuf_select(int dev, struct fileinfo * file, int sel_type, select_table * wait return 0; } -#endif /* ALLOW_SELECT */ +#endif /* ALLOW_POLL */ #endif #else /* CONFIG_AUDIO */ diff --git a/sys/i386/isa/sound/gus_wave.c b/sys/i386/isa/sound/gus_wave.c index f1269f540c87..8cb3419dffa8 100644 --- a/sys/i386/isa/sound/gus_wave.c +++ b/sys/i386/isa/sound/gus_wave.c @@ -37,7 +37,7 @@ #define GUS_PNP_ID 0x100561e #define MAX_CARDS 8 -#define MAX_GUS_PNP 8 +#define MAX_GUS_PNP 12 /* Static ports */ @@ -61,7 +61,7 @@ IWAVE iw; #define MAX_SAMPLE 150 #define MAX_PATCH 256 -#define MAX_GUS_PNP 12 + u_int gus_pnp_found[MAX_GUS_PNP] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; diff --git a/sys/i386/isa/sound/local.h b/sys/i386/isa/sound/local.h index 8c86bd8af633..e42e79059f16 100644 --- a/sys/i386/isa/sound/local.h +++ b/sys/i386/isa/sound/local.h @@ -28,6 +28,11 @@ #define CONFIG_GUSMAX #endif +#include "sscape.h" +#if NSSCAPE != 0 && !defined(CONFIG_SSCAPE) +#define CONFIG_SSCAPE +#endif + #include "trix.h" #if NTRIX > 0 #define INCLUDE_TRIX_BOOT @@ -35,7 +40,7 @@ #define CONFIG_YM3812 #endif -#if defined(CONFIG_GUSMAX) || ( NTRIX > 0 ) +#if defined(CONFIG_GUSMAX) || ( NSSCAPE > 0 ) || ( NTRIX > 0 ) #define CONFIG_AD1848 #endif @@ -86,9 +91,7 @@ #define CONFIG_YM3812 #endif -#include "sscape.h" - -#define ALLOW_SELECT +#define ALLOW_POLL /* #undef CONFIG_PAS */ /* #undef CONFIG_ADLIB */ diff --git a/sys/i386/isa/sound/midibuf.c b/sys/i386/isa/sound/midibuf.c index faddba9a4401..e452e0a35f21 100644 --- a/sys/i386/isa/sound/midibuf.c +++ b/sys/i386/isa/sound/midibuf.c @@ -37,6 +37,11 @@ */ #define MAX_QUEUE_SIZE 4000 +int +MIDIbuf_poll (int dev, struct fileinfo *file, int events, select_table * wait); + +void +drain_midi_queue(int dev); static int *midi_sleeper[MAX_MIDI_DEV] = {NULL}; static volatile struct snd_wait midi_sleep_flag[MAX_MIDI_DEV] = { {0}}; @@ -393,4 +398,32 @@ MIDIbuf_ioctl(int dev, struct fileinfo * file, u_int cmd, ioctl_arg arg) return midi_devs[dev]->ioctl(dev, cmd, arg); } } + +#ifdef ALLOW_POLL +int +MIDIbuf_poll (int dev, struct fileinfo *file, int events, select_table * wait) +{ + int revents = 0; + + dev = dev >> 4; + + if (events & (POLLIN | POLLRDNORM)) + if (!DATA_AVAIL (midi_in_buf[dev])) + selrecord(wait, &selinfo[dev]); + else + revents |= events & (POLLIN | POLLRDNORM); + + if (events & (POLLOUT | POLLWRNORM)) + if (SPACE_AVAIL (midi_out_buf[dev])) + selrecord(wait, &selinfo[dev]); + else + revents |= events & (POLLOUT | POLLWRNORM); + + return revents; +} + +#endif /* ALLOW_SELECT */ + + + #endif diff --git a/sys/i386/isa/sound/os.h b/sys/i386/isa/sound/os.h index 159e460ce058..104906917ec4 100644 --- a/sys/i386/isa/sound/os.h +++ b/sys/i386/isa/sound/os.h @@ -93,7 +93,7 @@ typedef struct sound_os_info { #define PROCESS_ABORTING( f) (f.aborting || CURSIG(curproc)) #define TIMED_OUT( f) (f.mode & WK_TIMEOUT) -#ifdef ALLOW_SELECT +#ifdef ALLOW_POLL typedef struct proc select_table; extern struct selinfo selinfo[]; #endif diff --git a/sys/i386/isa/sound/sequencer.c b/sys/i386/isa/sound/sequencer.c index ef86ed7921f3..d6bd72d3f305 100644 --- a/sys/i386/isa/sound/sequencer.c +++ b/sys/i386/isa/sound/sequencer.c @@ -37,7 +37,8 @@ #include void seq_drain_midi_queues(void); - +int +sequencer_poll (int dev, struct fileinfo *file, int events, select_table * wait); static int sequencer_ok = 0; static struct sound_timer_operations *tmr; static int tmr_no = -1; /* Currently selected timer */ @@ -1677,6 +1678,40 @@ sequencer_ioctl(int dev, struct fileinfo * file, return -(EINVAL); } +#ifdef ALLOW_POLL +int +sequencer_poll (int dev, struct fileinfo *file, int events, select_table * wait) +{ + unsigned long flags; + int revents = 0; + + dev = dev >> 4; + flags = splhigh(); + + + if (events & (POLLIN | POLLRDNORM)) + if (!iqlen) + selrecord(wait, &selinfo[dev]); + else { + revents |= events & (POLLIN | POLLRDNORM); + midi_sleep_flag.mode &= ~WK_SLEEP; + } + + if (events & (POLLOUT | POLLWRNORM)) + if (qlen >= SEQ_MAX_QUEUE) + selrecord(wait, &selinfo[dev]); + else { + revents |= events & (POLLOUT | POLLWRNORM); + seq_sleep_flag.mode &= ~WK_SLEEP; + } + + splx(flags); + + return (revents); +} + +#endif + void sequencer_timer(void *dummy) diff --git a/sys/i386/isa/sound/sound_calls.h b/sys/i386/isa/sound/sound_calls.h index c0b0721c0411..5f3a067754d3 100644 --- a/sys/i386/isa/sound/sound_calls.h +++ b/sys/i386/isa/sound/sound_calls.h @@ -17,7 +17,7 @@ void DMAbuf_reset_dma (int dev); void DMAbuf_inputintr(int dev); void DMAbuf_outputintr(int dev, int underflow_flag); void DMAbuf_start_devices(u_int devmask); -#ifdef ALLOW_SELECT +#ifdef ALLOW_POLL int DMAbuf_select(int dev, struct fileinfo *file, int sel_type, select_table * wait); #endif diff --git a/sys/i386/isa/sound/soundcard.c b/sys/i386/isa/sound/soundcard.c index a653a5385ea3..a83df9377eba 100644 --- a/sys/i386/isa/sound/soundcard.c +++ b/sys/i386/isa/sound/soundcard.c @@ -67,6 +67,14 @@ static int soundcard_configured = 0; static struct fileinfo files[SND_NDEVS]; struct selinfo selinfo[SND_NDEVS >> 4]; +int +MIDIbuf_poll (int dev, struct fileinfo *file, int events, select_table * wait); + +int +audio_poll(int dev, struct fileinfo * file, int events, select_table * wait); + +int +sequencer_poll (int dev, struct fileinfo *file, int events, select_table * wait); void sndintr __P((int unit)); int sndprobe __P((struct isa_device *)); @@ -118,9 +126,8 @@ struct isa_driver gusxvidriver = {sndprobe, sndattach, "gusxvi"}; struct isa_driver gusmaxdriver = {sndprobe, sndattach, "gusmax"}; struct isa_driver uartdriver = {sndprobe, sndattach, "uart"}; struct isa_driver mssdriver = {sndprobe, sndattach, "mss"}; - -/* XXX does this work ? lr 970714 */ -struct isa_driver sscapedriver = {sndprobe, sndattach, "ss_mss"}; +struct isa_driver sscapedriver = {sndprobe, sndattach, "sscape"}; +struct isa_driver sscape_mssdriver = {sndprobe, sndattach, "sscape_mss"}; short ipri_to_irq(u_short ipri); @@ -228,16 +235,16 @@ sndpoll(dev_t dev, int events, struct proc * p) dev = minor(dev); /* printf ("snd_select(dev=%d, rw=%d, pid=%d)\n", dev, rw, p->p_pid); */ -#ifdef ALLOW_SELECT +#ifdef ALLOW_POLL switch (dev & 0x0f) { -#ifdef EXCLUDE_SEQUENCER +#ifdef CONFIG_SEQUENCER case SND_DEV_SEQ: case SND_DEV_SEQ2: return sequencer_poll(dev, &files[dev], events, p); break; #endif -#ifdef EXCLUDE_MIDI +#ifdef CONFIG_MIDI case SND_DEV_MIDIN: return MIDIbuf_poll(dev, &files[dev], events, p); break; @@ -256,7 +263,7 @@ sndpoll(dev_t dev, int events, struct proc * p) return 0; } -#endif /* ALLOW_SELECT */ +#endif /* ALLOW_POLL */ DEB(printf("sound_ioctl(dev=%d, cmd=0x%x, arg=0x%x)\n", dev, cmd, arg)); return 0 ; @@ -307,12 +314,14 @@ driver_to_voxunit(struct isa_driver * driver) return (SNDCARD_GUS16); else if (driver == &mssdriver) return (SNDCARD_MSS); + else if (driver == &sscapedriver) + return(SNDCARD_SSCAPE); + else if (driver == &sscape_mssdriver) + return(SNDCARD_SSCAPE_MSS); else if (driver == &trixdriver) return (SNDCARD_TRXPRO); else if (driver == &trixsbdriver) return (SNDCARD_TRXPRO_SB); - else if (driver == &sscapedriver) - return (SNDCARD_SSCAPE_MSS); else return (0); } @@ -542,8 +551,7 @@ conf_printf(char *name, struct address_info * hw_config) if (!trace_init) return; - printf("snd0: <%s> ", name); -#if 0 + printf("<%s> ", name); if (hw_config->io_base != -1 ) printf("at 0x%03x", hw_config->io_base); @@ -555,7 +563,7 @@ conf_printf(char *name, struct address_info * hw_config) if (hw_config->dma2 != -1) printf(",%d", hw_config->dma2); } -#endif + } @@ -565,10 +573,7 @@ conf_printf2(char *name, int base, int irq, int dma, int dma2) if (!trace_init) return; - printf("snd0: <%s> ", name); -#if 0 - if (hw_config->io_base != -1 ) - printf("at 0x%03x", hw_config->io_base); + printf("<%s> at 0x%03x", name, base); if (irq) printf(" irq %d", irq); @@ -578,7 +583,7 @@ conf_printf2(char *name, int base, int irq, int dma, int dma2) if (dma2 != -1) printf(",%d", dma2); } -#endif + } diff --git a/sys/i386/isa/sound/sscape.c b/sys/i386/isa/sound/sscape.c index 3ba866eb67a2..bfd5abe8afd1 100644 --- a/sys/i386/isa/sound/sscape.c +++ b/sys/i386/isa/sound/sscape.c @@ -33,6 +33,8 @@ #include +#define EXCLUDE_NATIVE_PCM + /* * I/O ports */ @@ -292,7 +294,7 @@ sscapeintr(int irq) u_char bits, tmp; static int debug = 0; - printf("sscapeintr(0x%02x)\n", (bits = sscape_read(devc, GA_INTSTAT_REG))); + DEB(printf("sscapeintr(0x%02x)\n", (bits = sscape_read(devc, GA_INTSTAT_REG)))); if ((sscape_sleep_flag.mode & WK_SLEEP)) { sscape_sleep_flag.mode = WK_WAKEUP; wakeup(sscape_sleeper);