Update of /cvsroot/alsa/alsa-kernel/core/oss
In directory sc8-pr-cvs1:/tmp/cvs-serv32754/core/oss
Modified Files:
pcm_oss.c
Log Message:
Fixed oops in oss_sync() routine.
Index: pcm_oss.c
===================================================================
RCS file: /cvsroot/alsa/alsa-kernel/core/oss/pcm_oss.c,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -r1.50 -r1.51
--- pcm_oss.c 25 Sep 2003 18:55:43 -0000 1.50
+++ pcm_oss.c 29 Sep 2003 18:16:18 -0000 1.51
@@ -142,7 +142,7 @@
case AFMT_U16_LE: return SNDRV_PCM_FORMAT_U16_LE;
case AFMT_U16_BE: return SNDRV_PCM_FORMAT_U16_BE;
case AFMT_MPEG: return SNDRV_PCM_FORMAT_MPEG;
- default: return SNDRV_PCM_FORMAT_U8;
+ default: return SNDRV_PCM_FORMAT_U8;
}
}
@@ -554,6 +554,7 @@
}
runtime->oss.prepare = 0;
runtime->oss.prev_hw_ptr_interrupt = 0;
+ runtime->oss.period_ptr = 0;
return 0;
}
@@ -818,6 +819,8 @@
return xfer > 0 ? (snd_pcm_sframes_t)xfer :
tmp;
runtime->oss.bytes += tmp;
runtime->oss.buffer_used = 0;
+ runtime->oss.period_ptr += tmp;
+ runtime->oss.period_ptr %= runtime->oss.period_bytes;
}
} else {
tmp = snd_pcm_oss_write2(substream, (char *)buf,
runtime->oss.period_bytes, 0);
@@ -974,6 +977,8 @@
unsigned int saved_f_flags;
snd_pcm_substream_t *substream;
snd_pcm_runtime_t *runtime;
+ snd_pcm_format_t format;
+ unsigned long width;
size_t size;
substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK];
@@ -981,24 +986,35 @@
if ((err = snd_pcm_oss_make_ready(substream)) < 0)
return err;
runtime = substream->runtime;
+ format = snd_pcm_oss_format_from(runtime->oss.format));
+ width = snd_pcm_format_physical_width(format);
if (runtime->oss.buffer_used > 0) {
- snd_pcm_format_set_silence(runtime->format,
+ size = (8 * (runtime->oss.period_bytes -
runtime->oss.buffer_used) + 7) / width;
+ snd_pcm_format_set_silence(format,
runtime->oss.buffer +
runtime->oss.buffer_used,
- bytes_to_samples(runtime,
runtime->oss.period_bytes - runtime->oss.buffer_used));
+ size);
err = snd_pcm_oss_sync1(substream, runtime->oss.period_bytes);
if (err < 0)
return err;
+ } else if (runtime->oss.period_ptr > 0) {
+ size = runtime->oss.period_bytes - runtime->oss.period_ptr;
+ snd_pcm_format_set_silence(format,
+ runtime->oss.buffer,
+ size * 8 / width);
+ err = snd_pcm_oss_sync1(substream, size);
+ if (err < 0)
+ return err;
}
- size = runtime->control->appl_ptr % runtime->period_size;
- if (size > 0) {
- size = runtime->period_size - size;
- size *= runtime->channels;
- snd_pcm_format_set_silence(runtime->format,
+ size = runtime->oss.period_bytes;
+ size1 = frames_to_bytes(runtime, runtime->period_size);
+ while (size < size1) {
+ snd_pcm_format_set_silence(format,
runtime->oss.buffer,
- size);
- err = snd_pcm_oss_sync1(substream, samples_to_bytes(runtime,
size));
+ (8 * runtime->oss.period_size + 7)
/ width);
+ err = snd_pcm_oss_sync1(substream, runtime->oss.period_bytes);
if (err < 0)
return err;
+ size += runtime->oss.period_bytes;
}
saved_f_flags = substream->ffile->f_flags;
substream->ffile->f_flags &= ~O_NONBLOCK;
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog