Merge with /pub/scm/linux/kernel/git/torvalds/linux-2.6.git
[powerpc.git] / sound / core / oss / pcm_oss.c
index 1a80502..468fca8 100644 (file)
@@ -125,17 +125,26 @@ int snd_pcm_plugin_append(snd_pcm_plugin_t *plugin)
 static long snd_pcm_oss_bytes(snd_pcm_substream_t *substream, long frames)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_pcm_uframes_t buffer_size = snd_pcm_lib_buffer_bytes(substream);
-       frames = frames_to_bytes(runtime, frames);
+       long buffer_size = snd_pcm_lib_buffer_bytes(substream);
+       long bytes = frames_to_bytes(runtime, frames);
        if (buffer_size == runtime->oss.buffer_bytes)
-               return frames;
-       return (runtime->oss.buffer_bytes * frames) / buffer_size;
+               return bytes;
+#if BITS_PER_LONG >= 64
+       return runtime->oss.buffer_bytes * bytes / buffer_size;
+#else
+       {
+               u64 bsize = (u64)runtime->oss.buffer_bytes * (u64)bytes;
+               u32 rem;
+               div64_32(&bsize, buffer_size, &rem);
+               return (long)bsize;
+       }
+#endif
 }
 
 static long snd_pcm_alsa_frames(snd_pcm_substream_t *substream, long bytes)
 {
        snd_pcm_runtime_t *runtime = substream->runtime;
-       snd_pcm_uframes_t buffer_size = snd_pcm_lib_buffer_bytes(substream);
+       long buffer_size = snd_pcm_lib_buffer_bytes(substream);
        if (buffer_size == runtime->oss.buffer_bytes)
                return bytes_to_frames(runtime, bytes);
        return bytes_to_frames(runtime, (buffer_size * bytes) / runtime->oss.buffer_bytes);
@@ -464,7 +473,8 @@ static int snd_pcm_oss_change_params(snd_pcm_substream_t *substream)
        sw_params->tstamp_mode = SNDRV_PCM_TSTAMP_NONE;
        sw_params->period_step = 1;
        sw_params->sleep_min = 0;
-       sw_params->avail_min = 1;
+       sw_params->avail_min = substream->stream == SNDRV_PCM_STREAM_PLAYBACK ?
+               1 : runtime->period_size;
        sw_params->xfer_align = 1;
        if (atomic_read(&runtime->mmap_count) ||
            (substream->oss.setup && substream->oss.setup->nosilence)) {