/[rdesktop]/sourceforge.net/trunk/rdesktop/rdpsnd_alsa.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_alsa.c

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

revision 1345 by ossman_, Thu Dec 7 11:54:29 2006 UTC revision 1351 by stargo, Sun Dec 24 13:53:23 2006 UTC
# Line 32  Line 32 
32  #define DEFAULTDEVICE   "default"  #define DEFAULTDEVICE   "default"
33  #define MAX_FRAMES      32  #define MAX_FRAMES      32
34    
35    static struct pollfd pfds[32];
36    static int num_fds;
37    
38  static snd_pcm_t *pcm_handle = NULL;  static snd_pcm_t *pcm_handle = NULL;
39  static snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK;  static snd_pcm_stream_t stream = SND_PCM_STREAM_PLAYBACK;
40  static BOOL reopened;  static BOOL reopened;
# Line 40  static int audiochannels; Line 43  static int audiochannels;
43  static unsigned int rate;  static unsigned int rate;
44  static char *pcm_name;  static char *pcm_name;
45    
46    void alsa_play(void);
47    
48    void
49    alsa_add_fds(int *n, fd_set * rfds, fd_set * wfds, struct timeval *tv)
50    {
51            int err;
52            struct pollfd *f;
53    
54            if (!pcm_handle)
55                    return;
56    
57            if (rdpsnd_queue_empty())
58                    return;
59    
60            num_fds = snd_pcm_poll_descriptors_count(pcm_handle);
61    
62            if (num_fds > sizeof(pfds) / sizeof(*pfds))
63                    return;
64    
65            err = snd_pcm_poll_descriptors(pcm_handle, pfds, num_fds);
66            if (err < 0)
67                    return;
68    
69            for (f = pfds; f < &pfds[num_fds]; f++)
70            {
71                    if (f->events & POLLIN)
72                            FD_SET(f->fd, rfds);
73                    if (f->events & POLLOUT)
74                            FD_SET(f->fd, wfds);
75                    if (f->fd > *n && (f->events & (POLLIN | POLLOUT)))
76                            *n = f->fd;
77            }
78    }
79    
80    void
81    alsa_check_fds(fd_set * rfds, fd_set * wfds)
82    {
83            struct pollfd *f;
84            int err;
85            unsigned short revents;
86    
87            if (!pcm_handle)
88                    return;
89    
90            for (f = pfds; f < &pfds[num_fds]; f++)
91            {
92                    f->revents = 0;
93                    if (f->fd != -1)
94                    {
95                            /* Fixme: This doesn't properly deal with things like POLLHUP */
96                            if (FD_ISSET(f->fd, rfds))
97                                    f->revents |= POLLIN;
98                            if (FD_ISSET(f->fd, wfds))
99                                    f->revents |= POLLOUT;
100                    }
101            }
102    
103            err = snd_pcm_poll_descriptors_revents(pcm_handle, pfds, num_fds, &revents);
104            if (err < 0)
105                    return;
106    
107            if (revents & POLLOUT)
108                    alsa_play();
109    }
110    
111  BOOL  BOOL
112  alsa_open(void)  alsa_open(void)
113  {  {
# Line 51  alsa_open(void) Line 119  alsa_open(void)
119                  return False;                  return False;
120          }          }
121    
         g_dsp_fd = 0;  
   
122          reopened = True;          reopened = True;
123    
124          return True;          return True;
# Line 221  alsa_play(void) Line 287  alsa_play(void)
287                  prev_us = tv.tv_usec;                  prev_us = tv.tv_usec;
288          }          }
289    
290            /* We shouldn't be called if the queue is empty, but still */
291          if (rdpsnd_queue_empty())          if (rdpsnd_queue_empty())
         {  
                 g_dsp_busy = 0;  
292                  return;                  return;
         }  
293    
294          packet = rdpsnd_queue_current_packet();          packet = rdpsnd_queue_current_packet();
295          out = &packet->s;          out = &packet->s;
# Line 271  alsa_play(void) Line 335  alsa_play(void)
335    
336                  rdpsnd_queue_next(delay_us);                  rdpsnd_queue_next(delay_us);
337          }          }
   
         g_dsp_busy = 1;  
         return;  
338  }  }
339    
 static struct audio_driver alsa_driver = {  
         .name = "alsa",  
         .description = "ALSA output driver, default device: " DEFAULTDEVICE,  
   
         .wave_out_open = alsa_open,  
         .wave_out_close = alsa_close,  
         .wave_out_format_supported = alsa_format_supported,  
         .wave_out_set_format = alsa_set_format,  
         .wave_out_volume = rdpsnd_dsp_softvol_set,  
         .wave_out_play = alsa_play,  
   
         .need_byteswap_on_be = 0,  
         .need_resampling = 0,  
 };  
   
340  struct audio_driver *  struct audio_driver *
341  alsa_register(char *options)  alsa_register(char *options)
342  {  {
343            static struct audio_driver alsa_driver;
344    
345            alsa_driver.name = xstrdup("alsa");
346            alsa_driver.description = xstrdup("ALSA output driver, default device: " DEFAULTDEVICE);
347    
348            alsa_driver.add_fds = alsa_add_fds;
349            alsa_driver.check_fds = alsa_check_fds;
350    
351            alsa_driver.wave_out_open = alsa_open;
352            alsa_driver.wave_out_close = alsa_close;
353            alsa_driver.wave_out_format_supported = alsa_format_supported;
354            alsa_driver.wave_out_set_format = alsa_set_format;
355            alsa_driver.wave_out_volume = rdpsnd_dsp_softvol_set;
356    
357            alsa_driver.need_byteswap_on_be = 0;
358            alsa_driver.need_resampling = 0;
359    
360          if (options)          if (options)
361          {          {
362                  pcm_name = xstrdup(options);                  pcm_name = xstrdup(options);

Legend:
Removed from v.1345  
changed lines
  Added in v.1351

  ViewVC Help
Powered by ViewVC 1.1.26