*** Output/OSS/audio.c.orig Wed Jun 16 21:51:12 1999 --- Output/OSS/audio.c Sat Jul 3 17:32:16 1999 *************** *** 89,95 **** else bytes = 0; ! if (!oss_used() && bytes <= 0) return FALSE; return TRUE; --- 89,95 ---- else bytes = 0; ! if (!oss_used() /*&& bytes <= 0*/) return FALSE; return TRUE; *************** *** 185,198 **** void oss_write(void *ptr, gint length) { ! gint cnt, off = 0, w; if (!realtime) { - while (oss_free() < length) - xmms_usleep(10000); - remove_prebuffer = FALSE; written += length; while (length > 0) { --- 185,197 ---- void oss_write(void *ptr, gint length) { ! gint cnt, off = 0; ! audio_buf_info abuf_info; if (!realtime) { remove_prebuffer = FALSE; + written += length; while (length > 0) { *************** *** 200,206 **** memcpy(buffer + wr_index, ptr + off, cnt); wr_index = (wr_index + cnt) % buffer_size; length -= cnt; ! off = cnt; } } --- 199,205 ---- memcpy(buffer + wr_index, ptr + off, cnt); wr_index = (wr_index + cnt) % buffer_size; length -= cnt; ! off += cnt; } } *************** *** 208,231 **** { if (paused) return; ! ! if (frequency == efrequency) ! w = write(fd, ptr, length); ! else ! w = oss_downsample(ptr, length, frequency, efrequency); ! ! if (w == -1 && errno == EIO) { ! close(fd); ! fd = open(device_name, O_WRONLY); ! oss_set_audio_params(); ! if (frequency == efrequency) ! w = write(fd, ptr, length); ! else ! w = oss_downsample(ptr, length, frequency, efrequency); } written += length; - output_bytes += w; } } --- 207,223 ---- { if (paused) return; ! ioctl(fd,SNDCTL_DSP_GETOSPACE,&abuf_info); ! while(abuf_info.bytes < length) { ! xmms_usleep(10000); ! ioctl(fd,SNDCTL_DSP_GETOSPACE,&abuf_info); } + if(frequency==efrequency) + output_bytes += write(fd,ptr,length); + else + output_bytes += oss_downsample(ptr,length,frequency,efrequency); written += length; } } *************** *** 281,323 **** void *oss_loop(void *arg) { gint length, cnt, w; - audio_buf_info abuf_info; fd_set set; struct timeval tv; while (going) { if (oss_used() > prebuffer_size) - { prebuffer = FALSE; - } if (oss_used() > 0 && !paused && !prebuffer) { length = min(blk_size, oss_used()); while (length > 0) { cnt = min(length, buffer_size - rd_index); ! ! if (frequency == efrequency) ! w = write(fd, buffer + rd_index, cnt); ! else ! w = oss_downsample(buffer + rd_index, cnt, frequency, efrequency); ! if (w == -1 && errno == EIO) { ! close(fd); ! fd = open(device_name, O_WRONLY); ! oss_set_audio_params(); ! if (frequency == efrequency) ! w = write(fd, buffer + rd_index, cnt); ! else ! w = oss_downsample(buffer + rd_index, cnt, frequency, efrequency); } ! output_bytes += w; ! rd_index = (rd_index + cnt) % buffer_size; ! length -= cnt; } ! /* if (!oss_used()) ! ioctl(fd, SNDCTL_DSP_POST, 0);*/ } else xmms_usleep(10000); --- 273,312 ---- void *oss_loop(void *arg) { gint length, cnt, w; fd_set set; struct timeval tv; + audio_buf_info abuf_info; while (going) { if (oss_used() > prebuffer_size) prebuffer = FALSE; if (oss_used() > 0 && !paused && !prebuffer) { length = min(blk_size, oss_used()); while (length > 0) { cnt = min(length, buffer_size - rd_index); ! ioctl(fd,SNDCTL_DSP_GETOSPACE,&abuf_info); ! if(abuf_info.bytes >= length) { ! while(length > 0) ! { ! cnt = min(length,buffer_size-rd_index); ! if(frequency==efrequency) ! output_bytes += write(fd,buffer+rd_index,cnt); ! else ! output_bytes += oss_downsample(buffer+rd_index,cnt,frequency,efrequency); ! rd_index=(rd_index+cnt)%buffer_size; ! length-=cnt; ! } } ! else ! xmms_usleep(10000); ! } ! if (!oss_used()) ! ioctl(fd, SNDCTL_DSP_POST, 0); } else xmms_usleep(10000); *************** *** 450,466 **** channels = nch; frequency = rate; ! buffer_size = (oss_cfg.buffer_size * bps) / 1000; ! if (buffer_size < 8192) ! buffer_size = 8192; ! prebuffer_size = (buffer_size * oss_cfg.prebuffer) / 100; ! if (buffer_size - prebuffer_size < 4096) ! prebuffer_size = buffer_size - 4096; ! ! buffer_size += device_buffer_size; ! buffer = g_malloc0(buffer_size); ! mlock(buffer, buffer_size); ! going = 1; flush = -1; prebuffer = 1; --- 439,457 ---- channels = nch; frequency = rate; ! if(!realtime) ! { ! buffer_size = (oss_cfg.buffer_size * bps) / 1000; ! if (buffer_size < 8192) ! buffer_size = 8192; ! prebuffer_size = (buffer_size * oss_cfg.prebuffer) / 100; ! if (buffer_size - prebuffer_size < 4096) ! prebuffer_size = buffer_size - 4096; ! ! buffer_size += device_buffer_size; ! buffer = g_malloc0(buffer_size); ! mlock(buffer, buffer_size); ! } going = 1; flush = -1; prebuffer = 1;