/[rdesktop]/sourceforge.net/branches/seamlessrdp-branch/rdesktop/rdpsnd_oss.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/branches/seamlessrdp-branch/rdesktop/rdpsnd_oss.c

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

revision 510 by stargo, Thu Oct 23 11:11:31 2003 UTC revision 793 by stargo, Wed Nov 3 09:57:48 2004 UTC
# Line 1  Line 1 
1  /*  /*
2     rdesktop: A Remote Desktop Protocol client.     rdesktop: A Remote Desktop Protocol client.
3     Sound Channel Process Functions - Open Sound System     Sound Channel Process Functions - Open Sound System
4     Copyright (C) Matthew Chapman 2003     Copyright (C) Matthew Chapman 2003
# Line 33  int g_dsp_fd; Line 33  int g_dsp_fd;
33  BOOL g_dsp_busy = False;  BOOL g_dsp_busy = False;
34  static int g_snd_rate;  static int g_snd_rate;
35  static short g_samplewidth;  static short g_samplewidth;
36    static BOOL g_driver_broken = False;
37    
38  static struct audio_packet  static struct audio_packet
39  {  {
# Line 45  static unsigned int queue_hi, queue_lo; Line 46  static unsigned int queue_hi, queue_lo;
46  BOOL  BOOL
47  wave_out_open(void)  wave_out_open(void)
48  {  {
49          char *dsp_dev = "/dev/dsp";          char *dsp_dev = getenv("AUDIODEV");
50    
51            if (dsp_dev == NULL)
52            {
53                    dsp_dev = "/dev/dsp";
54            }
55    
56          if ((g_dsp_fd = open(dsp_dev, O_WRONLY | O_NONBLOCK)) == -1)          if ((g_dsp_fd = open(dsp_dev, O_WRONLY | O_NONBLOCK)) == -1)
57          {          {
# Line 80  wave_out_format_supported(WAVEFORMATEX * Line 86  wave_out_format_supported(WAVEFORMATEX *
86  BOOL  BOOL
87  wave_out_set_format(WAVEFORMATEX * pwfx)  wave_out_set_format(WAVEFORMATEX * pwfx)
88  {  {
89          int channels, format;          int stereo, format, fragments;
90    
91          ioctl(g_dsp_fd, SNDCTL_DSP_RESET, NULL);          ioctl(g_dsp_fd, SNDCTL_DSP_RESET, NULL);
92          ioctl(g_dsp_fd, SNDCTL_DSP_SYNC, NULL);          ioctl(g_dsp_fd, SNDCTL_DSP_SYNC, NULL);
# Line 99  wave_out_set_format(WAVEFORMATEX * pwfx) Line 105  wave_out_set_format(WAVEFORMATEX * pwfx)
105                  return False;                  return False;
106          }          }
107    
108          channels = pwfx->nChannels;          if (pwfx->nChannels == 2)
         if (ioctl(g_dsp_fd, SNDCTL_DSP_CHANNELS, &channels) == -1)  
109          {          {
110                  perror("SNDCTL_DSP_CHANNELS");                  stereo = 1;
111                  close(g_dsp_fd);                  g_samplewidth *= 2;
112                  return False;          }
113            else
114            {
115                    stereo = 0;
116          }          }
117    
118          if (channels == 2)          if (ioctl(g_dsp_fd, SNDCTL_DSP_STEREO, &stereo) == -1)
119          {          {
120                  g_samplewidth *= 2;                  perror("SNDCTL_DSP_CHANNELS");
121                    close(g_dsp_fd);
122                    return False;
123          }          }
124    
125          g_snd_rate = pwfx->nSamplesPerSec;          g_snd_rate = pwfx->nSamplesPerSec;
# Line 120  wave_out_set_format(WAVEFORMATEX * pwfx) Line 130  wave_out_set_format(WAVEFORMATEX * pwfx)
130                  return False;                  return False;
131          }          }
132    
133            /* try to get 7 fragments of 2^12 bytes size */
134            fragments = (7 << 16) + 12;
135            ioctl(g_dsp_fd, SNDCTL_DSP_SETFRAGMENT, &fragments);
136    
137            if (!g_driver_broken)
138            {
139                    audio_buf_info info;
140    
141                    memset(&info,0,sizeof(info));
142                    if (ioctl(g_dsp_fd, SNDCTL_DSP_GETOSPACE, &info) == -1)
143                    {
144                            perror("SNDCTL_DSP_GETOSPACE");
145                            close(g_dsp_fd);
146                            return False;
147                    }
148    
149                    if (info.fragments == 0 || info.fragstotal == 0 || info.fragsize == 0)
150                    {
151                            fprintf(stderr,
152                                    "Broken OSS-driver detected: fragments: %d, fragstotal: %d, fragsize: %d\n",
153                                    info.fragments, info.fragstotal, info.fragsize);
154                            g_driver_broken = True;
155                    }
156            }
157    
158          return True;          return True;
159  }  }
160    
# Line 135  wave_out_volume(uint16 left, uint16 righ Line 170  wave_out_volume(uint16 left, uint16 righ
170    
171          if (use_dev_mixer)          if (use_dev_mixer)
172          {          {
173                  if ((fd_mix = open( "/dev/mixer", O_RDWR|O_NONBLOCK )) == -1 )                  if ((fd_mix = open("/dev/mixer", O_RDWR | O_NONBLOCK)) == -1)
174                  {                  {
175                          perror("open /dev/mixer");                          perror("open /dev/mixer");
176                          return;                          return;
# Line 178  wave_out_write(STREAM s, uint16 tick, ui Line 213  wave_out_write(STREAM s, uint16 tick, ui
213          packet->s.p += 4;          packet->s.p += 4;
214    
215          /* we steal the data buffer from s, give it a new one */          /* we steal the data buffer from s, give it a new one */
216          s->data = malloc(s->size);          s->data = (uint8 *) malloc(s->size);
217    
218          if (!g_dsp_busy)          if (!g_dsp_busy)
219                  wave_out_play();                  wave_out_play();
# Line 194  wave_out_play(void) Line 229  wave_out_play(void)
229          static long startedat_s;          static long startedat_s;
230          static BOOL started = False;          static BOOL started = False;
231          struct timeval tv;          struct timeval tv;
232            audio_buf_info info;
233    
234          while (1)          while (1)
235          {          {
# Line 214  wave_out_play(void) Line 250  wave_out_play(void)
250                          started = True;                          started = True;
251                  }                  }
252    
253                  len = write(g_dsp_fd, out->p, out->end - out->p);                  len = out->end - out->p;
254    
255                    if (!g_driver_broken)
256                    {
257                            memset(&info,0,sizeof(info));
258                            if (ioctl(g_dsp_fd, SNDCTL_DSP_GETOSPACE, &info) == -1)
259                            {
260                                    perror("SNDCTL_DSP_GETOSPACE");
261                                    return;
262                            }
263    
264                            if (info.fragments == 0)
265                            {
266                                    g_dsp_busy = 1;
267                                    return;
268                            }
269    
270                            if (info.fragments * info.fragsize < len
271                                && info.fragments * info.fragsize > 0)
272                            {
273                                    len = info.fragments * info.fragsize;
274                            }
275                    }
276    
277    
278                    len = write(g_dsp_fd, out->p, len);
279                  if (len == -1)                  if (len == -1)
280                  {                  {
281                          if (errno != EWOULDBLOCK)                          if (errno != EWOULDBLOCK)
# Line 228  wave_out_play(void) Line 289  wave_out_play(void)
289                  {                  {
290                          long long duration;                          long long duration;
291                          long elapsed;                          long elapsed;
292                            
293                          gettimeofday(&tv, NULL);                          gettimeofday(&tv, NULL);
294                          duration =                          duration = (out->size * (1000000 / (g_samplewidth * g_snd_rate)));
295                                  (out->size * (1000000 /                          elapsed = (tv.tv_sec - startedat_s) * 1000000 + (tv.tv_usec - startedat_us);
                                 (g_samplewidth * g_snd_rate)));  
                         elapsed =  
                                 (tv.tv_sec - startedat_s) * 1000000 +  
                                 (tv.tv_usec - startedat_us);  
296    
297                          if ( elapsed >= (duration * 7) / 10 )                          if (elapsed >= (duration * 85) / 100)
298                          {                          {
299                                  rdpsnd_send_completion(packet->tick, packet->index);                                  rdpsnd_send_completion(packet->tick, packet->index);
300                                  free(out->data);                                  free(out->data);

Legend:
Removed from v.510  
changed lines
  Added in v.793

  ViewVC Help
Powered by ViewVC 1.1.26