some 2.1.4 sound patches

Heiko Eissfeldt (heiko@colossus.escape.de)
Sat, 19 Oct 1996 18:03:27 +0200 (MEST)


Hi,

here are some rough patches to make 2.1.4 compile with
the sound driver.

I did a rough test with with playing a wav file through
my Media Vision Sound Pro Audio Spectrum 16.

Please have a look,
Heiko

--- drivers/sound/audio.c.or Wed Oct 16 18:16:35 1996
+++ drivers/sound/audio.c Wed Oct 16 20:33:34 1996
@@ -243,7 +243,7 @@
copy_from_user (&dma_buf[buf_ptr], &(buf)[p], l);
}
else
- audio_devs[dev]->d->copy_from_user (dev,
+ (audio_devs[dev]->d->copy_from_user) (dev,
dma_buf, buf_ptr, buf, p, l);

if (local_conversion[dev] == AFMT_MU_LAW)
@@ -381,7 +381,11 @@
break;

case SNDCTL_DSP_SETFMT:
- return snd_ioctl_return ((int *) arg, set_format (dev, get_user ((int *) arg)));
+ {
+ int i;
+ get_user(i, (int *)arg);
+ return snd_ioctl_return ((int *) arg, set_format (dev, i));
+ }

case SNDCTL_DSP_GETISPACE:
if (!(audio_devs[dev]->open_mode & OPEN_READ))
--- drivers/sound/dmabuf.c.or Wed Oct 16 18:16:36 1996
+++ drivers/sound/dmabuf.c Wed Oct 16 21:00:24 1996
@@ -766,9 +766,13 @@
switch (cmd)
{
case SOUND_PCM_WRITE_RATE:
- if (local)
- return audio_devs[dev]->d->set_speed (dev, larg);
- return snd_ioctl_return ((int *) arg, audio_devs[dev]->d->set_speed (dev, get_user ((int *) arg)));
+ {
+ int i;
+ if (local)
+ return audio_devs[dev]->d->set_speed (dev, larg);
+ get_user (i,(int *) arg);
+ return snd_ioctl_return ((int *) arg, audio_devs[dev]->d->set_speed (dev, i));
+ }

case SOUND_PCM_READ_RATE:
if (local)
@@ -776,14 +780,22 @@
return snd_ioctl_return ((int *) arg, audio_devs[dev]->d->set_speed (dev, 0));

case SNDCTL_DSP_STEREO:
- if (local)
- return audio_devs[dev]->d->set_channels (dev, larg + 1) - 1;
- return snd_ioctl_return ((int *) arg, audio_devs[dev]->d->set_channels (dev, get_user ((int *) arg) + 1) - 1);
+ {
+ int i;
+ if (local)
+ return audio_devs[dev]->d->set_channels (dev, larg + 1) - 1;
+ get_user (i, (int *) arg);
+ return snd_ioctl_return ((int *) arg, audio_devs[dev]->d->set_channels (dev, i + 1) - 1);
+ }

case SOUND_PCM_WRITE_CHANNELS:
- if (local)
- return audio_devs[dev]->d->set_channels (dev, (short) larg);
- return snd_ioctl_return ((int *) arg, audio_devs[dev]->d->set_channels (dev, get_user ((int *) arg)));
+ {
+ int i;
+ if (local)
+ return audio_devs[dev]->d->set_channels (dev, (short) larg);
+ get_user (i, (int *) arg);
+ return snd_ioctl_return ((int *) arg, audio_devs[dev]->d->set_channels (dev, i));
+ }

case SOUND_PCM_READ_CHANNELS:
if (local)
@@ -791,9 +803,13 @@
return snd_ioctl_return ((int *) arg, audio_devs[dev]->d->set_channels (dev, 0));

case SNDCTL_DSP_SAMPLESIZE:
- if (local)
- return audio_devs[dev]->d->set_bits (dev, larg);
- return snd_ioctl_return ((int *) arg, audio_devs[dev]->d->set_bits (dev, get_user ((int *) arg)));
+ {
+ int i;
+ if (local)
+ return audio_devs[dev]->d->set_bits (dev, larg);
+ get_user (i, (int *) arg);
+ return snd_ioctl_return ((int *) arg, audio_devs[dev]->d->set_bits (dev, i ));
+ }

case SOUND_PCM_READ_BITS:
if (local)
@@ -827,9 +843,10 @@

case SNDCTL_DSP_SUBDIVIDE:
{
- int fact = get_user ((int *) arg);
+ int fact;
int ret;

+ get_user (fact,(int *) arg);
ret = dma_subdivide (dev, dmap_out, arg, fact);
if (ret < 0)
return ret;
@@ -851,9 +868,10 @@

case SNDCTL_DSP_SETFRAGMENT:
{
- int fact = get_user ((int *) arg);
+ int fact;
int ret;

+ get_user (fact,(int *) arg);
ret = dma_set_fragment (dev, dmap_out, arg, fact);
if (ret < 0)
return ret;
@@ -930,9 +948,11 @@
{
unsigned long flags;

- int bits = get_user ((int *) arg) & audio_devs[dev]->open_mode;
+ int bits;
int changed;

+ get_user (bits,(int *) arg);
+ bits &= audio_devs[dev]->open_mode;
if (audio_devs[dev]->d->trigger == NULL)
return -(EINVAL);

--- drivers/sound/midi_synth.c.or Wed Oct 16 18:16:37 1996
+++ drivers/sound/midi_synth.c Wed Oct 16 21:10:43 1996
@@ -537,7 +537,7 @@
{
unsigned char data;

- data = get_fs_byte (&((addr)[hdr_size + i]));
+ get_user (data,&((addr)[hdr_size + i]));

eox_seen = (i > 0 && data & 0x80); /* End of sysex */

--- drivers/sound/midibuf.c.or Wed Oct 16 18:16:37 1996
+++ drivers/sound/midibuf.c Wed Oct 16 21:09:13 1996
@@ -473,7 +473,7 @@
{

case SNDCTL_MIDI_PRETIME:
- val = (int) get_user ((int *) arg);
+ get_user (val, (int *) arg);
if (val < 0)
val = 0;

--- drivers/sound/pas2_mixer.c.or Thu Aug 22 13:21:05 1996
+++ drivers/sound/pas2_mixer.c Wed Oct 16 21:13:49 1996
@@ -218,7 +218,9 @@

if (cmd == SOUND_MIXER_PRIVATE1) /* Set loudness bit */
{
- int level = get_user ((int *) arg);
+ int level;
+
+ get_user (level,(int *) arg);

if (level == -1) /* Return current settings */
{
@@ -240,7 +242,9 @@

if (cmd == SOUND_MIXER_PRIVATE2) /* Set enhance bit */
{
- int level = get_user ((int *) arg);
+ int level;
+
+ get_user (level,(int *) arg);

if (level == -1) /* Return current settings */
{
@@ -269,7 +273,9 @@

if (cmd == SOUND_MIXER_PRIVATE3) /* Set mute bit */
{
- int level = get_user ((int *) arg);
+ int level;
+
+ get_user (level,(int *) arg);

if (level == -1) /* Return current settings */
{
@@ -292,9 +298,12 @@

if (((cmd >> 8) & 0xff) == 'M')
{
- if (_IOC_DIR (cmd) & _IOC_WRITE)
- return snd_ioctl_return ((int *) arg, pas_mixer_set (cmd & 0xff, get_user ((int *) arg)));
- else
+ if (_IOC_DIR (cmd) & _IOC_WRITE) {
+ int i;
+
+ get_user (i,(int *) arg);
+ return snd_ioctl_return ((int *) arg, pas_mixer_set (cmd & 0xff, i));
+ } else
{ /*
* Read parameters
*/
--- drivers/sound/pas2_pcm.c.or Thu Aug 22 13:21:05 1996
+++ drivers/sound/pas2_pcm.c Wed Oct 16 21:18:09 1996
@@ -156,7 +156,11 @@
case SOUND_PCM_WRITE_RATE:
if (local)
return pcm_set_speed ((int) arg);
- return snd_ioctl_return ((int *) arg, pcm_set_speed (get_user ((int *) arg)));
+ {
+ int i;
+ get_user (i,(int *) arg);
+ return snd_ioctl_return ((int *) arg, pcm_set_speed (i));
+ }
break;

case SOUND_PCM_READ_RATE:
@@ -168,13 +172,21 @@
case SNDCTL_DSP_STEREO:
if (local)
return pcm_set_channels ((int) arg + 1) - 1;
- return snd_ioctl_return ((int *) arg, pcm_set_channels (get_user ((int *) arg) + 1) - 1);
+ {
+ int i;
+ get_user (i,(int *) arg);
+ return snd_ioctl_return ((int *) arg, pcm_set_channels (i + 1) - 1);
+ }
break;

case SOUND_PCM_WRITE_CHANNELS:
if (local)
return pcm_set_channels ((int) arg);
- return snd_ioctl_return ((int *) arg, pcm_set_channels (get_user ((int *) arg)));
+ {
+ int i;
+ get_user (i,(int *) arg);
+ return snd_ioctl_return ((int *) arg, pcm_set_channels (i));
+ }
break;

case SOUND_PCM_READ_CHANNELS:
@@ -186,7 +198,11 @@
case SNDCTL_DSP_SETFMT:
if (local)
return pcm_set_bits ((int) arg);
- return snd_ioctl_return ((int *) arg, pcm_set_bits (get_user ((int *) arg)));
+ {
+ int i;
+ get_user (i,(int *) arg);
+ return snd_ioctl_return ((int *) arg, pcm_set_bits (i));
+ }
break;

case SOUND_PCM_READ_BITS:
@@ -197,9 +213,13 @@
case SOUND_PCM_WRITE_FILTER: /*
* NOT YET IMPLEMENTED
*/
- if (get_user ((int *) arg) > 1)
- return -(EINVAL);
- pcm_filter = get_user ((int *) arg);
+ {
+ int i;
+ get_user (i,(int *) arg);
+ if (i > 1)
+ return -(EINVAL);
+ pcm_filter = i;
+ }
break;

case SOUND_PCM_READ_FILTER:
--- drivers/sound/patmgr.c.or Wed Oct 16 18:16:37 1996
+++ drivers/sound/patmgr.c Thu Oct 17 03:46:43 1996
@@ -81,6 +81,7 @@
{
unsigned long flags;
int ok = 0;
+ struct patmgr_info *mboxdev;

if (count != sizeof (struct patmgr_info))
{
@@ -88,12 +89,13 @@
return -(EIO);
}

+ mboxdev = mbox[dev];
while (!ok && !current_got_fatal_signal ())
{
save_flags (flags);
cli ();

- while (!(mbox[dev] && msg_direction[dev] == A_TO_S) &&
+ while (!(mboxdev && msg_direction[dev] == A_TO_S) &&
!current_got_fatal_signal ())
{

@@ -102,9 +104,9 @@
server_wait_flag[dev].flags &= ~WK_SLEEP;;
}

- if (mbox[dev] && msg_direction[dev] == A_TO_S)
+ if (mboxdev && msg_direction[dev] == A_TO_S)
{
- copy_to_user (&(buf)[0], (char *) mbox[dev], count);
+ copy_to_user (&(buf)[0], (char *) mboxdev, count);
msg_direction[dev] = 0;
ok = 1;
}
--- drivers/sound/sequencer.c.or Wed Oct 16 18:16:37 1996
+++ drivers/sound/sequencer.c Thu Oct 17 05:06:48 1996
@@ -1512,6 +1512,69 @@
*/
}

+static int sndctl_midi_info(int dev, struct midi_info *inf, void *arg)
+{
+ struct midi_info *infop;
+
+ if (dev < 0 || dev >= max_mididev)
+ return -(ENXIO);
+
+ infop = &midi_devs[dev]->info;
+ copy_to_user ((char *) arg, (char *) infop, sizeof (inf));
+ return 0;
+}
+
+static int sndctl_pmgr_iface(struct patmgr_info *inf, void *arg)
+{
+ int err, dev;
+ copy_from_user ((char *) inf, (char *) arg, sizeof (*inf));
+ dev = inf->device;
+
+ if (dev < 0 || dev >= num_synths)
+ {
+ return -(ENXIO);
+ }
+
+ if (!synth_devs[dev]->pmgr_interface)
+ {
+ return -(ENXIO);
+ }
+
+ if ((err = synth_devs[dev]->pmgr_interface (dev, inf)) == -1)
+ {
+ return err;
+ }
+
+ copy_to_user ((char *) arg, (char *) inf, sizeof (*inf));
+ return 0;
+}
+
+static int sndctl_pmgr_access(struct patmgr_info *inf, void *arg)
+{
+ int dev, err;
+
+ copy_from_user ((char *) inf, (char *) arg, sizeof (*inf));
+ dev = inf->device;
+
+ if (dev < 0 || dev >= num_synths)
+ {
+ return -(ENXIO);
+ }
+
+ if (!pmgr_present[dev])
+ {
+ return -(ESRCH);
+ }
+
+ if ((err = pmgr_access (dev, inf)) < 0)
+ {
+ return err;
+ }
+
+ copy_to_user ((char *) arg, (char *) inf, sizeof (*inf));
+ return 0;
+}
+
int
sequencer_ioctl (int dev, struct fileinfo *file,
unsigned int cmd, caddr_t arg)
@@ -1544,7 +1607,8 @@

if (seq_mode != SEQ_2)
return -(EINVAL);
- pending_timer = get_user ((int *) arg);
+
+ get_user (pending_timer,(int *) arg);

if (pending_timer < 0 || pending_timer >= num_sound_timers)
{
@@ -1591,7 +1655,7 @@
*/
return -(EIO);

- midi_dev = get_user ((int *) arg);
+ get_user (midi_dev,(int *) arg);
if (midi_dev >= max_mididev)
return -(ENXIO);

@@ -1639,9 +1703,12 @@
if (seq_mode == SEQ_2)
return tmr->ioctl (tmr_no, cmd, arg);

- if (get_user ((int *) arg) != 0)
- return -(EINVAL);
-
+ {
+ int rate;
+ get_user (rate, (int *) arg);
+ if (rate != 0)
+ return -(EINVAL);
+ }
return snd_ioctl_return ((int *) arg, HZ);
break;

@@ -1649,7 +1716,7 @@
{
int err;

- dev = get_user ((int *) arg);
+ get_user (dev,(int *) arg);
if (dev < 0 || dev >= num_synths)
{
return -(ENXIO);
@@ -1678,7 +1745,9 @@

case SNDCTL_SYNTH_MEMAVL:
{
- int dev = get_user ((int *) arg);
+ int dev;
+
+ get_user (dev,(int *) arg);

if (dev < 0 || dev >= num_synths)
return -(ENXIO);
@@ -1692,7 +1761,9 @@

case SNDCTL_FM_4OP_ENABLE:
{
- int dev = get_user ((int *) arg);
+ int dev;
+
+ get_user (dev,(int *) arg);

if (dev < 0 || dev >= num_synths)
return -(ENXIO);
@@ -1710,7 +1781,7 @@
struct synth_info inf;
int dev;

- copy_from_user ((char *) &inf, &((char *) arg)[0], sizeof (inf));
+ copy_from_user ((char *) &inf, (char *) arg, sizeof (inf));
dev = inf.device;

if (dev < 0 || dev >= max_synthdev)
@@ -1728,7 +1799,7 @@
struct seq_event_rec event_rec;
unsigned long flags;

- copy_from_user ((char *) &event_rec, &((char *) arg)[0], sizeof (event_rec));
+ copy_from_user ((char *) &event_rec, (char *) arg, sizeof (event_rec));

save_flags (flags);
cli ();
@@ -1741,24 +1812,20 @@

case SNDCTL_MIDI_INFO:
{
- struct midi_info inf;
int dev;
+ struct midi_info inf;

- copy_from_user ((char *) &inf, &((char *) arg)[0], sizeof (inf));
+ copy_from_user ((char *) &inf, (char *) arg, sizeof (inf));
dev = inf.device;

- if (dev < 0 || dev >= max_mididev)
- return -(ENXIO);
-
- copy_to_user (&((char *) arg)[0], (char *) &(midi_devs[dev]->info), sizeof (inf));
- return 0;
+ return sndctl_midi_info(dev, &inf, arg);
}
break;

case SNDCTL_PMGR_IFACE:
{
struct patmgr_info *inf;
- int dev, err;
+ int err;

if ((inf = (struct patmgr_info *) vmalloc (sizeof (*inf))) == NULL)
{
@@ -1766,37 +1833,16 @@
return -(EIO);
}

- copy_from_user ((char *) inf, &((char *) arg)[0], sizeof (*inf));
- dev = inf->device;
-
- if (dev < 0 || dev >= num_synths)
- {
- vfree (inf);
- return -(ENXIO);
- }
-
- if (!synth_devs[dev]->pmgr_interface)
- {
- vfree (inf);
- return -(ENXIO);
- }
-
- if ((err = synth_devs[dev]->pmgr_interface (dev, inf)) == -1)
- {
- vfree (inf);
- return err;
- }
-
- copy_to_user (&((char *) arg)[0], (char *) inf, sizeof (*inf));
+ err = sndctl_pmgr_iface(inf, arg);
vfree (inf);
- return 0;
+ return err;
}
break;

case SNDCTL_PMGR_ACCESS:
{
struct patmgr_info *inf;
- int dev, err;
+ int err;

if ((inf = (struct patmgr_info *) vmalloc (sizeof (*inf))) == NULL)
{
@@ -1804,36 +1850,17 @@
return -(EIO);
}

- copy_from_user ((char *) inf, &((char *) arg)[0], sizeof (*inf));
- dev = inf->device;
-
- if (dev < 0 || dev >= num_synths)
- {
- vfree (inf);
- return -(ENXIO);
- }
-
- if (!pmgr_present[dev])
- {
- vfree (inf);
- return -(ESRCH);
- }
-
- if ((err = pmgr_access (dev, inf)) < 0)
- {
- vfree (inf);
- return err;
- }
-
- copy_to_user (&((char *) arg)[0], (char *) inf, sizeof (*inf));
+ err = sndctl_pmgr_access(inf, arg);
vfree (inf);
- return 0;
+ return err;
}
break;

case SNDCTL_SEQ_THRESHOLD:
{
- int tmp = get_user ((int *) arg);
+ int tmp;
+
+ get_user (tmp,(int *) arg);

if (dev) /*
* Patch manager
@@ -1851,7 +1878,9 @@

case SNDCTL_MIDI_PRETIME:
{
- int val = get_user ((int *) arg);
+ int val;
+
+ get_user (val,(int *) arg);

if (val < 0)
val = 0;
--- drivers/sound/sound_timer.c.or Thu Aug 22 13:21:05 1996
+++ drivers/sound/sound_timer.c Thu Oct 17 05:11:44 1996
@@ -214,7 +214,9 @@

case SNDCTL_TMR_TIMEBASE:
{
- int val = get_user ((int *) arg);
+ int val;
+
+ get_user (val,(int *) arg);

if (val)
{
@@ -231,7 +233,9 @@

case SNDCTL_TMR_TEMPO:
{
- int val = get_user ((int *) arg);
+ int val;
+
+ get_user (val,(int *) arg);

if (val)
{
@@ -251,9 +255,12 @@
break;

case SNDCTL_SEQ_CTRLRATE:
- if (get_user ((int *) arg) != 0) /* Can't change */
- return -(EINVAL);
-
+ {
+ int i;
+ get_user (i,(int *) arg);
+ if (i != 0) /* Can't change */
+ return -(EINVAL);
+ }
return snd_ioctl_return ((int *) arg, ((curr_tempo * curr_timebase) + 30) / 60);
break;

--- drivers/sound/sys_timer.c.or Thu Aug 22 13:21:05 1996
+++ drivers/sound/sys_timer.c Thu Oct 17 05:13:40 1996
@@ -213,7 +213,9 @@

case SNDCTL_TMR_TIMEBASE:
{
- int val = get_user ((int *) arg);
+ int val;
+
+ get_user (val,(int *) arg);

if (val)
{
@@ -230,7 +232,9 @@

case SNDCTL_TMR_TEMPO:
{
- int val = get_user ((int *) arg);
+ int val;
+
+ get_user (val,(int *) arg);

if (val)
{
@@ -249,9 +253,13 @@
break;

case SNDCTL_SEQ_CTRLRATE:
- if (get_user ((int *) arg) != 0) /* Can't change */
- return -(EINVAL);
+ {
+ int i;

+ get_user (i,(int *) arg);
+ if (i != 0) /* Can't change */
+ return -(EINVAL);
+ }
return snd_ioctl_return ((int *) arg, ((curr_tempo * curr_timebase) + 30) / 60);
break;