CVS: rdesktop rdpsnd_oss.c,1.19,1.20
Michael Gernoth <[email protected]> Wed, 12 Jul 2006 02:57:07 -0700
| Newsgroups | gmane.network.rdesktop.cvs |
|---|---|
| Message-ID | <[email protected]> |
Update of /cvsroot/rdesktop/rdesktop
In directory sc8-pr-cvs9.sourceforge.net:/tmp/cvs-serv9249
Modified Files:
rdpsnd_oss.c
Log Message:
Fix high cpu-usage in OSS-driver
Index: rdpsnd_oss.c
===================================================================
RCS file: /cvsroot/rdesktop/rdesktop/rdpsnd_oss.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -C2 -d -r1.19 -r1.20
*** rdpsnd_oss.c 13 Apr 2006 07:37:24 -0000 1.19
--- rdpsnd_oss.c 12 Jul 2006 09:57:05 -0000 1.20
***************
*** 36,46 ****
#include <sys/soundcard.h>
#define MAX_QUEUE 10
int g_dsp_fd;
BOOL g_dsp_busy = False;
! static int g_snd_rate;
! static short g_samplewidth;
! static BOOL g_driver_broken = False;
static struct audio_packet
--- 36,46 ----
#include <sys/soundcard.h>
+ #define MAX_LEN 512
#define MAX_QUEUE 10
int g_dsp_fd;
BOOL g_dsp_busy = False;
! static int snd_rate;
! static short samplewidth;
static struct audio_packet
***************
*** 62,66 ****
}
! if ((g_dsp_fd = open(dsp_dev, O_WRONLY | O_NONBLOCK)) == -1)
{
perror(dsp_dev);
--- 62,66 ----
}
! if ((g_dsp_fd = open(dsp_dev, O_WRONLY)) == -1)
{
perror(dsp_dev);
***************
*** 68,73 ****
}
- /* Non-blocking so that user interface is responsive */
- fcntl(g_dsp_fd, F_SETFL, fcntl(g_dsp_fd, F_GETFL) | O_NONBLOCK);
return True;
}
--- 68,71 ----
***************
*** 96,99 ****
--- 94,98 ----
{
int stereo, format, fragments;
+ static BOOL driver_broken = False;
ioctl(g_dsp_fd, SNDCTL_DSP_RESET, NULL);
***************
*** 105,109 ****
format = AFMT_S16_LE;
! g_samplewidth = pwfx->wBitsPerSample / 8;
if (ioctl(g_dsp_fd, SNDCTL_DSP_SETFMT, &format) == -1)
--- 104,108 ----
format = AFMT_S16_LE;
! samplewidth = pwfx->wBitsPerSample / 8;
if (ioctl(g_dsp_fd, SNDCTL_DSP_SETFMT, &format) == -1)
***************
*** 117,121 ****
{
stereo = 1;
! g_samplewidth *= 2;
}
else
--- 116,120 ----
{
stereo = 1;
! samplewidth *= 2;
}
else
***************
*** 131,136 ****
}
! g_snd_rate = pwfx->nSamplesPerSec;
! if (ioctl(g_dsp_fd, SNDCTL_DSP_SPEED, &g_snd_rate) == -1)
{
perror("SNDCTL_DSP_SPEED");
--- 130,135 ----
}
! snd_rate = pwfx->nSamplesPerSec;
! if (ioctl(g_dsp_fd, SNDCTL_DSP_SPEED, &snd_rate) == -1)
{
perror("SNDCTL_DSP_SPEED");
***************
*** 139,147 ****
}
! /* try to get 7 fragments of 2^12 bytes size */
! fragments = (7 << 16) + 12;
ioctl(g_dsp_fd, SNDCTL_DSP_SETFRAGMENT, &fragments);
! if (!g_driver_broken)
{
audio_buf_info info;
--- 138,146 ----
}
! /* try to get 12 fragments of 2^12 bytes size */
! fragments = (12 << 16) + 12;
ioctl(g_dsp_fd, SNDCTL_DSP_SETFRAGMENT, &fragments);
! if (!driver_broken)
{
audio_buf_info info;
***************
*** 160,164 ****
"Broken OSS-driver detected: fragments: %d, fragstotal: %d, fragsize: %d\n",
info.fragments, info.fragstotal, info.fragsize);
! g_driver_broken = True;
}
}
--- 159,163 ----
"Broken OSS-driver detected: fragments: %d, fragstotal: %d, fragsize: %d\n",
info.fragments, info.fragstotal, info.fragsize);
! driver_broken = True;
}
}
***************
*** 238,319 ****
static BOOL started = False;
struct timeval tv;
- audio_buf_info info;
! while (1)
{
! if (queue_lo == queue_hi)
! {
! g_dsp_busy = 0;
! return;
! }
!
! packet = &packet_queue[queue_lo];
! out = &packet->s;
! if (!started)
! {
! gettimeofday(&tv, NULL);
! startedat_us = tv.tv_usec;
! startedat_s = tv.tv_sec;
! started = True;
! }
! len = out->end - out->p;
! if (!g_driver_broken)
! {
! memset(&info, 0, sizeof(info));
! if (ioctl(g_dsp_fd, SNDCTL_DSP_GETOSPACE, &info) == -1)
! {
! perror("SNDCTL_DSP_GETOSPACE");
! return;
! }
! if (info.fragments == 0)
! {
! g_dsp_busy = 1;
! return;
! }
! if (info.fragments * info.fragsize < len
! && info.fragments * info.fragsize > 0)
! {
! len = info.fragments * info.fragsize;
! }
! }
! len = write(g_dsp_fd, out->p, len);
! if (len == -1)
{
! if (errno != EWOULDBLOCK)
! perror("write audio");
! g_dsp_busy = 1;
! return;
}
!
! out->p += len;
! if (out->p == out->end)
{
! long long duration;
! long elapsed;
!
! gettimeofday(&tv, NULL);
! duration = (out->size * (1000000 / (g_samplewidth * g_snd_rate)));
! elapsed = (tv.tv_sec - startedat_s) * 1000000 + (tv.tv_usec - startedat_us);
!
! if (elapsed >= (duration * 85) / 100)
! {
! rdpsnd_send_completion(packet->tick, packet->index);
! free(out->data);
! queue_lo = (queue_lo + 1) % MAX_QUEUE;
! started = False;
! }
! else
! {
! g_dsp_busy = 1;
! return;
! }
}
}
}
--- 237,293 ----
static BOOL started = False;
struct timeval tv;
! if (queue_lo == queue_hi)
{
! g_dsp_busy = 0;
! return;
! }
! packet = &packet_queue[queue_lo];
! out = &packet->s;
! if (!started)
! {
! gettimeofday(&tv, NULL);
! startedat_us = tv.tv_usec;
! startedat_s = tv.tv_sec;
! started = True;
! }
! len = out->end - out->p;
! len = write(g_dsp_fd, out->p, (len > MAX_LEN) ? MAX_LEN : len);
! if (len == -1)
! {
! if (errno != EWOULDBLOCK)
! perror("write audio");
! g_dsp_busy = 1;
! return;
! }
! out->p += len;
! if (out->p == out->end)
! {
! long long duration;
! long elapsed;
+ gettimeofday(&tv, NULL);
+ duration = (out->size * (1000000 / (samplewidth * snd_rate)));
+ elapsed = (tv.tv_sec - startedat_s) * 1000000 + (tv.tv_usec - startedat_us);
! if (elapsed >= (duration * 85) / 100)
{
! rdpsnd_send_completion(packet->tick, packet->index);
! free(out->data);
! queue_lo = (queue_lo + 1) % MAX_QUEUE;
! started = False;
}
! else
{
! g_dsp_busy = 1;
! return;
}
}
+ g_dsp_busy = 1;
+ return;
}
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642