Update of /cvsroot/alsa/alsa-kernel/core/oss In directory sc8-pr-cvs1:/tmp/cvs-serv3047
Modified Files: pcm_oss.c Log Message: Fixed filling of the end silence - playback (in sync function) Index: pcm_oss.c =================================================================== RCS file: /cvsroot/alsa/alsa-kernel/core/oss/pcm_oss.c,v retrieving revision 1.62 retrieving revision 1.63 diff -u -r1.62 -r1.63 --- pcm_oss.c 29 Dec 2003 17:42:17 -0000 1.62 +++ pcm_oss.c 20 Jan 2004 13:50:49 -0000 1.63 @@ -955,6 +955,9 @@ runtime = substream->runtime; init_waitqueue_entry(&wait, current); add_wait_queue(&runtime->sleep, &wait); +#ifdef OSS_DEBUG + printk("sync1: size = %li\n", size); +#endif while (1) { result = snd_pcm_oss_write2(substream, runtime->oss.buffer, size, 1); if (result > 0) { @@ -996,16 +999,21 @@ snd_pcm_runtime_t *runtime; snd_pcm_format_t format; unsigned long width; - size_t size, size1; + size_t size; substream = pcm_oss_file->streams[SNDRV_PCM_STREAM_PLAYBACK]; if (substream != NULL) { + runtime = substream->runtime; + if (atomic_read(&runtime->mmap_count)) + goto __direct; 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) { +#ifdef OSS_DEBUG + printk("sync: buffer_used\n"); +#endif 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, @@ -1014,6 +1022,9 @@ if (err < 0) return err; } else if (runtime->oss.period_ptr > 0) { +#ifdef OSS_DEBUG + printk("sync: period_ptr\n"); +#endif size = runtime->oss.period_bytes - runtime->oss.period_ptr; snd_pcm_format_set_silence(format, runtime->oss.buffer, @@ -1022,17 +1033,35 @@ if (err < 0) return err; } - 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, - (8 * runtime->oss.period_bytes + 7) / width); - err = snd_pcm_oss_sync1(substream, runtime->oss.period_bytes); - if (err < 0) - return err; - size += runtime->oss.period_bytes; + /* + * The ALSA's period might be a bit large than OSS one. + * Fill the remain portion of ALSA period with zeros. + */ + size = runtime->control->appl_ptr % runtime->period_size; + if (size > 0) { + size = runtime->period_size - size; + if (runtime->access == SNDRV_PCM_ACCESS_RW_INTERLEAVED) { + size = (runtime->frame_bits * size) / 8; + while (size > 0) { + size_t size1 = size < runtime->oss.period_bytes ? size : runtime->oss.period_bytes; + size -= size1; + size1 *= 8; + size1 /= runtime->sample_bits; + snd_pcm_format_set_silence(runtime->format, + runtime->oss.buffer, + size1); + snd_pcm_lib_write(substream, runtime->oss.buffer, size1); + } + } else if (runtime->access == SNDRV_PCM_ACCESS_RW_NONINTERLEAVED) { + void *buffers[runtime->channels]; + memset(buffers, 0, runtime->channels * sizeof(void *)); + snd_pcm_lib_writev(substream, (void **)buffers, size); + } } + /* + * finish sync: drain the buffer + */ + __direct: saved_f_flags = substream->ffile->f_flags; substream->ffile->f_flags &= ~O_NONBLOCK; err = snd_pcm_kernel_playback_ioctl(substream, SNDRV_PCM_IOCTL_DRAIN, 0); ------------------------------------------------------- The SF.Net email is sponsored by EclipseCon 2004 Premiere Conference on Open Tools Development and Integration See the breadth of Eclipse activity. February 3-5 in Anaheim, CA. http://www.eclipsecon.org/osdn _______________________________________________ Alsa-cvslog mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/alsa-cvslog