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

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

revision 491 by stargo, Mon Oct 13 16:09:45 2003 UTC revision 772 by stargo, Sat Sep 11 19:17:48 2004 UTC
# Line 26  Line 26 
26  #include <errno.h>  #include <errno.h>
27  #include <sys/ioctl.h>  #include <sys/ioctl.h>
28  #include <sys/audioio.h>  #include <sys/audioio.h>
29    
30    #if (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
31  #include <stropts.h>  #include <stropts.h>
32    #endif
33    
34  #define MAX_QUEUE       10  #define MAX_QUEUE       10
35    
36  int g_dsp_fd;  int g_dsp_fd;
37  BOOL g_dsp_busy;  BOOL g_dsp_busy = False;
38  static BOOL reopened;  static BOOL g_reopened;
39  static BOOL swapaudio;  static BOOL g_swapaudio;
40  static short samplewidth;  static short g_samplewidth;
41    
42  static struct audio_packet {  static struct audio_packet
43    {
44          struct stream s;          struct stream s;
45          uint16 tick;          uint16 tick;
46          uint8 index;          uint8 index;
# Line 48  wave_out_open(void) Line 52  wave_out_open(void)
52  {  {
53          char *dsp_dev = getenv("AUDIODEV");          char *dsp_dev = getenv("AUDIODEV");
54    
55          if ( dsp_dev == NULL )          if (dsp_dev == NULL)
56          {          {
57                  dsp_dev="/dev/audio";                  dsp_dev = "/dev/audio";
58          }          }
59    
60          if ((g_dsp_fd = open(dsp_dev, O_WRONLY|O_NONBLOCK)) == -1)          if ((g_dsp_fd = open(dsp_dev, O_WRONLY | O_NONBLOCK)) == -1)
61          {          {
62                  perror(dsp_dev);                  perror(dsp_dev);
63                  return False;                  return False;
64          }          }
65    
66          /* Non-blocking so that user interface is responsive */          /* Non-blocking so that user interface is responsive */
67          fcntl(g_dsp_fd, F_SETFL, fcntl(g_dsp_fd, F_GETFL)|O_NONBLOCK);          fcntl(g_dsp_fd, F_SETFL, fcntl(g_dsp_fd, F_GETFL) | O_NONBLOCK);
68            
69          queue_lo = queue_hi = 0;          queue_lo = queue_hi = 0;
70          reopened = True;          g_reopened = True;
71            
72          return True;          return True;
73  }  }
74    
# Line 72  void Line 76  void
76  wave_out_close(void)  wave_out_close(void)
77  {  {
78          /* Ack all remaining packets */          /* Ack all remaining packets */
79          while ( queue_lo != queue_hi )          while (queue_lo != queue_hi)
80          {          {
81                  rdpsnd_send_completion(packet_queue[queue_lo].tick, packet_queue[queue_lo].index);                  rdpsnd_send_completion(packet_queue[queue_lo].tick, packet_queue[queue_lo].index);
82                  free(packet_queue[queue_lo].s.data);                  free(packet_queue[queue_lo].s.data);
83                  queue_lo = (queue_lo + 1) % MAX_QUEUE;                  queue_lo = (queue_lo + 1) % MAX_QUEUE;
84          }          }
85    
86    #if defined I_FLUSH && defined FLUSHW
87          /* Flush the audiobuffer */          /* Flush the audiobuffer */
88          ioctl(g_dsp_fd,I_FLUSH,FLUSHW);          ioctl(g_dsp_fd, I_FLUSH, FLUSHW);
89    #endif
90    #if defined AUDIO_FLUSH
91            ioctl(g_dsp_fd, AUDIO_FLUSH, NULL);
92    #endif
93          close(g_dsp_fd);          close(g_dsp_fd);
94  }  }
95    
96  BOOL  BOOL
97  wave_out_format_supported(WAVEFORMATEX *pwfx)  wave_out_format_supported(WAVEFORMATEX * pwfx)
98  {  {
99          if (pwfx->wFormatTag != WAVE_FORMAT_PCM)          if (pwfx->wFormatTag != WAVE_FORMAT_PCM)
100                  return False;                  return False;
# Line 98  wave_out_format_supported(WAVEFORMATEX * Line 107  wave_out_format_supported(WAVEFORMATEX *
107  }  }
108    
109  BOOL  BOOL
110  wave_out_set_format(WAVEFORMATEX *pwfx)  wave_out_set_format(WAVEFORMATEX * pwfx)
111  {  {
112          audio_info_t info;          audio_info_t info;
         int test = 1;  
113    
114          ioctl(g_dsp_fd, AUDIO_DRAIN, 0);          ioctl(g_dsp_fd, AUDIO_DRAIN, 0);
115          swapaudio = False;          g_swapaudio = False;
116          AUDIO_INITINFO(&info);          AUDIO_INITINFO(&info);
117    
118    
# Line 116  wave_out_set_format(WAVEFORMATEX *pwfx) Line 124  wave_out_set_format(WAVEFORMATEX *pwfx)
124          {          {
125                  info.play.encoding = AUDIO_ENCODING_LINEAR;                  info.play.encoding = AUDIO_ENCODING_LINEAR;
126                  /* Do we need to swap the 16bit values? (Are we BigEndian) */                  /* Do we need to swap the 16bit values? (Are we BigEndian) */
127                  swapaudio = !(*(uint8 *) (&test));  #ifdef B_ENDIAN
128                    g_swapaudio = 1;
129    #else
130                    g_swapaudio = 0;
131    #endif
132          }          }
133    
134          samplewidth = pwfx->wBitsPerSample/8;          g_samplewidth = pwfx->wBitsPerSample / 8;
135    
136          if (pwfx->nChannels == 1 )          if (pwfx->nChannels == 1)
137          {                {
138                  info.play.channels = AUDIO_CHANNELS_MONO;                  info.play.channels = 1;
139          }          }
140          else if (pwfx->nChannels == 2 )          else if (pwfx->nChannels == 2)
141          {          {
142                  info.play.channels = AUDIO_CHANNELS_STEREO;                  info.play.channels = 2;
143                  samplewidth *= 2;                  g_samplewidth *= 2;
144          }          }
145    
146          info.play.sample_rate = pwfx->nSamplesPerSec;          info.play.sample_rate = pwfx->nSamplesPerSec;
# Line 136  wave_out_set_format(WAVEFORMATEX *pwfx) Line 148  wave_out_set_format(WAVEFORMATEX *pwfx)
148          info.play.samples = 0;          info.play.samples = 0;
149          info.play.eof = 0;          info.play.eof = 0;
150          info.play.error = 0;          info.play.error = 0;
151          reopened = True;          g_reopened = True;
152    
153          if (ioctl(g_dsp_fd, AUDIO_SETINFO, &info) == -1)          if (ioctl(g_dsp_fd, AUDIO_SETINFO, &info) == -1)
154          {          {
# Line 155  wave_out_volume(uint16 left, uint16 righ Line 167  wave_out_volume(uint16 left, uint16 righ
167          uint balance;          uint balance;
168          uint volume;          uint volume;
169    
170          if (ioctl(g_dsp_fd, AUDIO_GETINFO, &info) == -1)          AUDIO_INITINFO(&info);
         {  
                 perror("AUDIO_GETINFO");  
                 return;  
         }  
171    
172          volume = (left > right) ? left : right;          volume = (left > right) ? left : right;
173    
174          if ( volume/AUDIO_MID_BALANCE != 0 )          if (volume / AUDIO_MID_BALANCE != 0)
175          {          {
176                  balance = AUDIO_MID_BALANCE - (left/(volume/AUDIO_MID_BALANCE)) + (right/(volume/AUDIO_MID_BALANCE));                  balance =
177                            AUDIO_MID_BALANCE - (left / (volume / AUDIO_MID_BALANCE)) +
178                            (right / (volume / AUDIO_MID_BALANCE));
179          }          }
180          else          else
181          {          {
182                  balance = AUDIO_MID_BALANCE;                  balance = AUDIO_MID_BALANCE;
183          }          }
184    
185          info.play.gain = volume/(65536/AUDIO_MAX_GAIN);          info.play.gain = volume / (65536 / AUDIO_MAX_GAIN);
186          info.play.balance = balance;          info.play.balance = balance;
187    
188          if (ioctl(g_dsp_fd, AUDIO_SETINFO, &info) == -1)          if (ioctl(g_dsp_fd, AUDIO_SETINFO, &info) == -1)
# Line 193  wave_out_write(STREAM s, uint16 tick, ui Line 203  wave_out_write(STREAM s, uint16 tick, ui
203                  error("No space to queue audio packet\n");                  error("No space to queue audio packet\n");
204                  return;                  return;
205          }          }
206            
207          queue_hi = next_hi;          queue_hi = next_hi;
208    
209          packet->s = *s;          packet->s = *s;
# Line 224  wave_out_play(void) Line 234  wave_out_play(void)
234    
235          while (1)          while (1)
236          {          {
237                  if ( reopened )                  if (g_reopened)
238                  {                  {
239                          /* Device was just (re)openend */                          /* Device was just (re)openend */
240                          samplecnt = 0;                          samplecnt = 0;
241                          swapped = False;                          swapped = False;
242                          sentcompletion = True;                          sentcompletion = True;
243                          reopened = False;                          g_reopened = False;
244                  }                  }
245    
246                  if (queue_lo == queue_hi)                  if (queue_lo == queue_hi)
# Line 243  wave_out_play(void) Line 253  wave_out_play(void)
253                  out = &packet->s;                  out = &packet->s;
254    
255                  /* Swap the current packet, but only once */                  /* Swap the current packet, but only once */
256                  if ( swapaudio && ! swapped )                  if (g_swapaudio && !swapped)
257                  {                  {
258                          for ( i = 0; i < out->end - out->p; i += 2 )                          for (i = 0; i < out->end - out->p; i += 2)
259                          {                          {
260                                  swap = *(out->p + i);                                  swap = *(out->p + i);
261                                  *(out->p + i) = *(out->p + i + 1);                                  *(out->p + i) = *(out->p + i + 1);
# Line 254  wave_out_play(void) Line 264  wave_out_play(void)
264                          swapped = True;                          swapped = True;
265                  }                  }
266    
267                  if ( sentcompletion )                  if (sentcompletion)
268                  {                  {
269                          sentcompletion = False;                          sentcompletion = False;
270                          numsamples = (out->end - out->p)/samplewidth;                          numsamples = (out->end - out->p) / g_samplewidth;
271                  }                  }
272    
273                  len=0;                  len = 0;
274    
275                  if ( out->end != out->p )                  if (out->end != out->p)
276                  {                  {
277                          len = write(g_dsp_fd, out->p, out->end - out->p);                          len = write(g_dsp_fd, out->p, out->end - out->p);
278                          if (len == -1)                          if (len == -1)
# Line 284  wave_out_play(void) Line 294  wave_out_play(void)
294                          }                          }
295    
296                          /* Ack the packet, if we have played at least 70% */                          /* Ack the packet, if we have played at least 70% */
297                          if ( info.play.samples >= samplecnt+((numsamples*7)/10) )                          if (info.play.samples >= samplecnt + ((numsamples * 7) / 10))
298                          {                          {
299                                  samplecnt += numsamples;                                  samplecnt += numsamples;
300                                  rdpsnd_send_completion(packet->tick, packet->index);                                  rdpsnd_send_completion(packet->tick, packet->index);

Legend:
Removed from v.491  
changed lines
  Added in v.772

  ViewVC Help
Powered by ViewVC 1.1.26