/[rdesktop]/sourceforge.net/trunk/rdesktop/rdpsnd_libao.c
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Diff of /sourceforge.net/trunk/rdesktop/rdpsnd_libao.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 841 by stargo, Tue Mar 8 17:23:26 2005 UTC revision 891 by stargo, Fri Apr 22 21:54:57 2005 UTC
# Line 25  Line 25 
25  #include <fcntl.h>  #include <fcntl.h>
26  #include <errno.h>  #include <errno.h>
27  #include <ao/ao.h>  #include <ao/ao.h>
28    #include <sys/time.h>
29    
30  #define MAX_QUEUE       10  #define MAX_QUEUE       10
31  #define WAVEOUTBUF      64  #define WAVEOUTBUF      64
# Line 35  int default_driver; Line 36  int default_driver;
36  int g_samplerate;  int g_samplerate;
37  int g_channels;  int g_channels;
38  BOOL g_dsp_busy = False;  BOOL g_dsp_busy = False;
39    static BOOL g_reopened;
40  static short g_samplewidth;  static short g_samplewidth;
41    
42  static struct audio_packet  static struct audio_packet
# Line 69  wave_out_open(void) Line 71  wave_out_open(void)
71          g_dsp_fd = 0;          g_dsp_fd = 0;
72          queue_lo = queue_hi = 0;          queue_lo = queue_hi = 0;
73    
74            g_reopened = True;
75    
76          return True;          return True;
77  }  }
78    
# Line 129  wave_out_set_format(WAVEFORMATEX * pwfx) Line 133  wave_out_set_format(WAVEFORMATEX * pwfx)
133                  return False;                  return False;
134          }          }
135    
136            g_reopened = True;
137    
138          return True;          return True;
139  }  }
# Line 172  wave_out_play(void) Line 177  wave_out_play(void)
177          STREAM out;          STREAM out;
178          unsigned char outbuf[WAVEOUTBUF];          unsigned char outbuf[WAVEOUTBUF];
179          int offset, len, i;          int offset, len, i;
180            static long prev_s, prev_us;
181            unsigned int duration;
182            struct timeval tv;
183            int next_tick;
184    
185            if (g_reopened)
186            {
187                    g_reopened = False;
188                    gettimeofday(&tv, NULL);
189                    prev_s = tv.tv_sec;
190                    prev_us = tv.tv_usec;
191            }
192    
193          if (queue_lo == queue_hi)          if (queue_lo == queue_hi)
194          {          {
# Line 182  wave_out_play(void) Line 199  wave_out_play(void)
199          packet = &packet_queue[queue_lo];          packet = &packet_queue[queue_lo];
200          out = &packet->s;          out = &packet->s;
201    
202            if (((queue_lo + 1) % MAX_QUEUE) != queue_hi)
203            {
204                    next_tick = packet_queue[(queue_lo + 1) % MAX_QUEUE].tick;
205            }
206            else
207            {
208                    next_tick = (packet->tick + 65535) % 65536;
209            }
210    
211          len = 0;          len = 0;
212    
213          if (g_samplerate == 22050)          if (g_samplerate == 22050)
# Line 216  wave_out_play(void) Line 242  wave_out_play(void)
242    
243          ao_play(o_device, outbuf, len);          ao_play(o_device, outbuf, len);
244    
245          if (out->p == out->end)          gettimeofday(&tv, NULL);
246    
247            duration = ((tv.tv_sec - prev_s) * 1000000 + (tv.tv_usec - prev_us)) / 1000;
248    
249            if (packet->tick > next_tick)
250                    next_tick += 65536;
251    
252            if ((out->p == out->end) || duration > next_tick - packet->tick + 500)
253          {          {
254                  rdpsnd_send_completion(packet->tick, packet->index);                  prev_s = tv.tv_sec;
255                    prev_us = tv.tv_usec;
256    
257                    if (abs((next_tick - packet->tick) - duration) > 20)
258                    {
259                            DEBUG(("duration: %d, calc: %d, ", duration, next_tick - packet->tick));
260                            DEBUG(("last: %d, is: %d, should: %d\n", packet->tick,
261                                   (packet->tick + duration) % 65536, next_tick % 65536));
262                    }
263    
264                    /* Until all drivers are using the windows sound-ticks, we need to
265                       substract the 50 ticks added later by rdpsnd.c */
266                    rdpsnd_send_completion(((packet->tick + duration) % 65536) - 50, packet->index);
267                  free(out->data);                  free(out->data);
268                  queue_lo = (queue_lo + 1) % MAX_QUEUE;                  queue_lo = (queue_lo + 1) % MAX_QUEUE;
269          }          }

Legend:
Removed from v.841  
changed lines
  Added in v.891

  ViewVC Help
Powered by ViewVC 1.1.26