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

Annotation of /sourceforge.net/rdesktop/trunk/rdpsnd_sgi.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1260 - (hide annotations)
Sun Sep 17 15:25:10 2006 UTC (17 years, 8 months ago) by stargo
Original Path: sourceforge.net/trunk/rdesktop/rdpsnd_sgi.c
File MIME type: text/plain
File size: 7383 byte(s)
unify audio-byteswapping as a dsp-function

1 astrand 963 /* -*- c-basic-offset: 8 -*-
2 stargo 744 rdesktop: A Remote Desktop Protocol client.
3     Sound Channel Process Functions - SGI/IRIX
4     Copyright (C) Matthew Chapman 2003
5     Copyright (C) GuoJunBo guojunbo@ict.ac.cn 2003
6 astrand 1032 Copyright (C) Jeremy Meng void.foo@gmail.com 2004, 2005
7 stargo 744
8     This program is free software; you can redistribute it and/or modify
9     it under the terms of the GNU General Public License as published by
10     the Free Software Foundation; either version 2 of the License, or
11     (at your option) any later version.
12    
13     This program is distributed in the hope that it will be useful,
14     but WITHOUT ANY WARRANTY; without even the implied warranty of
15     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     GNU General Public License for more details.
17    
18     You should have received a copy of the GNU General Public License
19     along with this program; if not, write to the Free Software
20     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21     */
22    
23     #include "rdesktop.h"
24     #include <errno.h>
25     #include <dmedia/audio.h>
26    
27 astrand 1032 /* #define IRIX_DEBUG 1 */
28 stargo 744
29     #define IRIX_MAX_VOL 65535
30    
31     ALconfig audioconfig;
32     ALport output_port;
33    
34     static int g_snd_rate;
35     static int width = AL_SAMPLE_16;
36 stargo 1255 static char *sgi_output_device = NULL;
37 stargo 744
38     double min_volume, max_volume, volume_range;
39     int resource, maxFillable;
40     int combinedFrameSize;
41    
42     BOOL
43 stargo 1255 sgi_open(void)
44 stargo 744 {
45 astrand 746 ALparamInfo pinfo;
46 stargo 1255 static int warned = 0;
47 stargo 744
48     #if (defined(IRIX_DEBUG))
49 stargo 1254 fprintf(stderr, "sgi_open: begin\n");
50 stargo 744 #endif
51    
52 stargo 1255 if (!warned && sgi_output_device)
53     {
54     warning("device-options not supported for libao-driver\n");
55     warned = 1;
56     }
57    
58 astrand 746 if (alGetParamInfo(AL_DEFAULT_OUTPUT, AL_GAIN, &pinfo) < 0)
59     {
60 stargo 1254 fprintf(stderr, "sgi_open: alGetParamInfo failed: %s\n",
61 astrand 746 alGetErrorString(oserror()));
62     }
63     min_volume = alFixedToDouble(pinfo.min.ll);
64     max_volume = alFixedToDouble(pinfo.max.ll);
65     volume_range = (max_volume - min_volume);
66 stargo 744 #if (defined(IRIX_DEBUG))
67 stargo 1254 fprintf(stderr, "sgi_open: minvol = %lf, maxvol= %lf, range = %lf.\n",
68 astrand 746 min_volume, max_volume, volume_range);
69 stargo 744 #endif
70    
71 stargo 1254 rdpsnd_queue_init();
72 stargo 744
73     audioconfig = alNewConfig();
74 stargo 912 if (audioconfig == (ALconfig) 0)
75 astrand 746 {
76 stargo 1254 fprintf(stderr, "sgi_open: alNewConfig failed: %s\n", alGetErrorString(oserror()));
77 stargo 744 return False;
78     }
79    
80     output_port = alOpenPort("rdpsnd", "w", 0);
81 astrand 746 if (output_port == (ALport) 0)
82     {
83 stargo 1254 fprintf(stderr, "sgi_open: alOpenPort failed: %s\n", alGetErrorString(oserror()));
84 stargo 744 return False;
85     }
86    
87     #if (defined(IRIX_DEBUG))
88 stargo 1254 fprintf(stderr, "sgi_open: returning\n");
89 stargo 744 #endif
90     return True;
91     }
92    
93     void
94 stargo 1255 sgi_close(void)
95 stargo 744 {
96     /* Ack all remaining packets */
97     #if (defined(IRIX_DEBUG))
98 stargo 1254 fprintf(stderr, "sgi_close: begin\n");
99 stargo 744 #endif
100 astrand 746
101 stargo 1254 while (!rdpsnd_queue_empty())
102 stargo 744 {
103 stargo 1254 /* We need to add 50 to tell windows that time has passed while
104     * playing this packet */
105     rdpsnd_send_completion(rdpsnd_queue_current_packet()->tick + 50,
106     rdpsnd_queue_current_packet()->index);
107     rdpsnd_queue_next();
108 stargo 744 }
109 astrand 746 alDiscardFrames(output_port, 0);
110    
111 stargo 744 alClosePort(output_port);
112     alFreeConfig(audioconfig);
113     #if (defined(IRIX_DEBUG))
114 stargo 1254 fprintf(stderr, "sgi_close: returning\n");
115 stargo 744 #endif
116     }
117    
118     BOOL
119 stargo 1255 sgi_format_supported(WAVEFORMATEX * pwfx)
120 stargo 744 {
121     if (pwfx->wFormatTag != WAVE_FORMAT_PCM)
122     return False;
123     if ((pwfx->nChannels != 1) && (pwfx->nChannels != 2))
124     return False;
125     if ((pwfx->wBitsPerSample != 8) && (pwfx->wBitsPerSample != 16))
126     return False;
127    
128     return True;
129     }
130    
131     BOOL
132 stargo 1255 sgi_set_format(WAVEFORMATEX * pwfx)
133 stargo 744 {
134     int channels;
135 astrand 746 int frameSize, channelCount;
136     ALpv params;
137    
138 stargo 744 #if (defined(IRIX_DEBUG))
139 stargo 1254 fprintf(stderr, "sgi_set_format: init...\n");
140 stargo 744 #endif
141    
142     if (pwfx->wBitsPerSample == 8)
143     width = AL_SAMPLE_8;
144 astrand 746 else if (pwfx->wBitsPerSample == 16)
145 stargo 744 width = AL_SAMPLE_16;
146    
147 stargo 912 /* Limited support to configure an opened audio port in IRIX. The
148 astrand 909 number of channels is a static setting and can not be changed after
149 stargo 912 a port is opened. So if the number of channels remains the same, we
150     can configure other settings; otherwise we have to reopen the audio
151 astrand 909 port, using same config. */
152 stargo 897
153 stargo 744 channels = pwfx->nChannels;
154     g_snd_rate = pwfx->nSamplesPerSec;
155    
156     alSetSampFmt(audioconfig, AL_SAMPFMT_TWOSCOMP);
157     alSetWidth(audioconfig, width);
158 astrand 909 if (channels != alGetChannels(audioconfig))
159 stargo 897 {
160     alClosePort(output_port);
161     alSetChannels(audioconfig, channels);
162     output_port = alOpenPort("rdpsnd", "w", audioconfig);
163 stargo 744
164 stargo 897 if (output_port == (ALport) 0)
165     {
166 stargo 1254 fprintf(stderr, "sgi_set_format: alOpenPort failed: %s\n",
167 astrand 909 alGetErrorString(oserror()));
168 stargo 897 return False;
169     }
170 stargo 744
171     }
172    
173     resource = alGetResource(output_port);
174     maxFillable = alGetFillable(output_port);
175 astrand 746 channelCount = alGetChannels(audioconfig);
176     frameSize = alGetWidth(audioconfig);
177 stargo 744
178 astrand 746 if (frameSize == 0 || channelCount == 0)
179     {
180 stargo 1254 fprintf(stderr, "sgi_set_format: bad frameSize or channelCount\n");
181 astrand 746 return False;
182     }
183     combinedFrameSize = frameSize * channelCount;
184 stargo 744
185 astrand 746 params.param = AL_RATE;
186     params.value.ll = (long long) g_snd_rate << 32;
187 stargo 744
188 astrand 746 if (alSetParams(resource, &params, 1) < 0)
189     {
190     fprintf(stderr, "wave_set_format: alSetParams failed: %s\n",
191     alGetErrorString(oserror()));
192     return False;
193     }
194     if (params.sizeOut < 0)
195     {
196     fprintf(stderr, "wave_set_format: invalid rate %d\n", g_snd_rate);
197     return False;
198     }
199 stargo 744
200     #if (defined(IRIX_DEBUG))
201 stargo 1254 fprintf(stderr, "sgi_set_format: returning...\n");
202 stargo 744 #endif
203     return True;
204     }
205    
206     void
207 stargo 1255 sgi_volume(uint16 left, uint16 right)
208 stargo 744 {
209 astrand 746 double gainleft, gainright;
210     ALpv pv[1];
211     ALfixed gain[8];
212 stargo 744
213     #if (defined(IRIX_DEBUG))
214 stargo 1254 fprintf(stderr, "sgi_volume: begin\n");
215 astrand 746 fprintf(stderr, "left='%d', right='%d'\n", left, right);
216 stargo 744 #endif
217 astrand 746
218     gainleft = (double) left / IRIX_MAX_VOL;
219 stargo 744 gainright = (double) right / IRIX_MAX_VOL;
220    
221 astrand 746 gain[0] = alDoubleToFixed(min_volume + gainleft * volume_range);
222     gain[1] = alDoubleToFixed(min_volume + gainright * volume_range);
223 stargo 744
224 astrand 746 pv[0].param = AL_GAIN;
225     pv[0].value.ptr = gain;
226     pv[0].sizeIn = 8;
227     if (alSetParams(AL_DEFAULT_OUTPUT, pv, 1) < 0)
228     {
229 stargo 1254 fprintf(stderr, "sgi_volume: alSetParams failed: %s\n",
230 astrand 746 alGetErrorString(oserror()));
231     return;
232     }
233 stargo 744
234     #if (defined(IRIX_DEBUG))
235 stargo 1254 fprintf(stderr, "sgi_volume: returning\n");
236 stargo 744 #endif
237     }
238    
239     void
240 stargo 1255 sgi_play(void)
241 stargo 744 {
242     struct audio_packet *packet;
243     ssize_t len;
244     unsigned int i;
245     STREAM out;
246     int gf;
247    
248     while (1)
249     {
250 stargo 1254 if (rdpsnd_queue_empty())
251 stargo 744 {
252     g_dsp_busy = False;
253     return;
254     }
255    
256 stargo 1254 packet = rdpsnd_queue_current_packet();
257 stargo 744 out = &packet->s;
258    
259     len = out->end - out->p;
260    
261 astrand 746 alWriteFrames(output_port, out->p, len / combinedFrameSize);
262 stargo 744
263     out->p += len;
264     if (out->p == out->end)
265     {
266 stargo 897 gf = alGetFilled(output_port);
267 astrand 909 if (gf < (4 * maxFillable / 10))
268 stargo 744 {
269     rdpsnd_send_completion(packet->tick, packet->index);
270 stargo 1254 rdpsnd_queue_next();
271 stargo 744 }
272     else
273     {
274     #if (defined(IRIX_DEBUG))
275 stargo 897 /* fprintf(stderr,"Busy playing...\n"); */
276 stargo 744 #endif
277     g_dsp_busy = True;
278 astrand 1032 usleep(10);
279 stargo 744 return;
280     }
281     }
282     }
283     }
284 stargo 1255
285     struct audio_driver *
286     sgi_register(char *options)
287     {
288 stargo 1256 static struct audio_driver sgi_driver;
289    
290     sgi_driver.wave_out_write = rdpsnd_queue_write;
291     sgi_driver.wave_out_open = sgi_open;
292     sgi_driver.wave_out_close = sgi_close;
293     sgi_driver.wave_out_format_supported = sgi_format_supported;
294     sgi_driver.wave_out_set_format = sgi_set_format;
295     sgi_driver.wave_out_volume = sgi_volume;
296     sgi_driver.wave_out_play = sgi_play;
297     sgi_driver.name = xstrdup("sgi");
298     sgi_driver.description = xstrdup("SGI output driver");
299 stargo 1260 sgi_driver.need_byteswap_on_be = 1;
300 stargo 1256 sgi_driver.next = NULL;
301    
302 stargo 1255 if (options)
303     {
304     sgi_output_device = xstrdup(options);
305     }
306     return &sgi_driver;
307     }

  ViewVC Help
Powered by ViewVC 1.1.26