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