Mercurial > hg > xemacs-beta
annotate src/hpplay.c @ 5307:c096d8051f89
Have NATNUMP give t for positive bignums; check limits appropriately.
src/ChangeLog addition:
2010-11-20 Aidan Kehoe <kehoea@parhasard.net>
* abbrev.c (Fexpand_abbrev):
* alloc.c:
* alloc.c (Fmake_list):
* alloc.c (Fmake_vector):
* alloc.c (Fmake_bit_vector):
* alloc.c (Fmake_byte_code):
* alloc.c (Fmake_string):
* alloc.c (vars_of_alloc):
* bytecode.c (UNUSED):
* bytecode.c (Fbyte_code):
* chartab.c (decode_char_table_range):
* cmds.c (Fself_insert_command):
* data.c (check_integer_range):
* data.c (Fnatnump):
* data.c (Fnonnegativep):
* data.c (Fstring_to_number):
* elhash.c (hash_table_size_validate):
* elhash.c (decode_hash_table_size):
* eval.c (Fbacktrace_frame):
* event-stream.c (lisp_number_to_milliseconds):
* event-stream.c (Faccept_process_output):
* event-stream.c (Frecent_keys):
* event-stream.c (Fdispatch_event):
* events.c (Fmake_event):
* events.c (Fevent_timestamp):
* events.c (Fevent_timestamp_lessp):
* events.h:
* events.h (struct command_builder):
* file-coding.c (gzip_putprop):
* fns.c:
* fns.c (check_sequence_range):
* fns.c (Frandom):
* fns.c (Fnthcdr):
* fns.c (Flast):
* fns.c (Fnbutlast):
* fns.c (Fbutlast):
* fns.c (Fmember):
* fns.c (Ffill):
* fns.c (Freduce):
* fns.c (replace_string_range_1):
* fns.c (Freplace):
* font-mgr.c (Ffc_pattern_get):
* frame-msw.c (msprinter_set_frame_properties):
* glyphs.c (check_valid_xbm_inline):
* indent.c (Fmove_to_column):
* intl-win32.c (mswindows_multibyte_to_unicode_putprop):
* lisp.h:
* lisp.h (ARRAY_DIMENSION_LIMIT):
* lread.c (decode_mode_1):
* mule-ccl.c (ccl_get_compiled_code):
* number.h:
* process-unix.c (unix_open_multicast_group):
* process.c (Fset_process_window_size):
* profile.c (Fstart_profiling):
* unicode.c (Funicode_to_char):
Change NATNUMP to return 1 for positive bignums; changes uses of
it and of CHECK_NATNUM appropriately, usually by checking for an
integer in an appropriate range.
Add array-dimension-limit and use it in #'make-vector,
#'make-string. Add array-total-size-limit, array-rank-limit while
we're at it, for the sake of any Common Lisp-oriented code that
uses these limits.
Rename check_int_range to check_integer_range, have it take
Lisp_Objects (and thus bignums) instead.
Remove bignum_butlast(), just set int_n to an appropriately large
integer if N is a bignum.
Accept bignums in check_sequence_range(), change the functions
that use check_sequence_range() appropriately.
Move the definition of NATNUMP() to number.h; document why it's a
reasonable name, contradicting an old comment.
tests/ChangeLog addition:
2010-11-20 Aidan Kehoe <kehoea@parhasard.net>
* automated/lisp-tests.el:
* automated/lisp-tests.el (featurep):
* automated/lisp-tests.el (wrong-type-argument):
* automated/mule-tests.el (featurep):
Check for args-out-of-range errors instead of wrong-type-argument
errors in various places when code is handed a large bignum
instead of a fixnum.
Also check for the wrong-type-argument errors when giving the same
code a non-integer value.
author | Aidan Kehoe <kehoea@parhasard.net> |
---|---|
date | Sat, 20 Nov 2010 16:49:11 +0000 |
parents | 4aebb0131297 |
children | 308d34e9f07d |
rev | line source |
---|---|
428 | 1 /* Copyright (C) 1993 Free Software Foundation, Inc. |
2 | |
3 This file is part of XEmacs. | |
4 | |
5 XEmacs is free software; you can redistribute it and/or modify it | |
6 under the terms of the GNU General Public License as published by the | |
7 Free Software Foundation; either version 2, or (at your option) any | |
8 later version. | |
9 | |
10 XEmacs is distributed in the hope that it will be useful, but WITHOUT | |
11 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
12 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
13 for more details. | |
14 | |
15 You should have received a copy of the GNU General Public License | |
16 along with XEmacs; see the file COPYING. If not, write to | |
17 the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
18 Boston, MA 02111-1307, USA. */ | |
19 | |
20 /* Synched up with: Not in FSF. */ | |
21 | |
563 | 22 /* This file Mule-ized by Ben Wing, 5-15-01. */ |
23 | |
428 | 24 |
25 /*** | |
26 NAME | |
27 hpplay | |
28 PURPOSE | |
29 Play .au sound files on hp9000s700 | |
30 BUGS | |
31 I have been unable to figure out how to use the volume feature, so no | |
444 | 32 attempt has been made to honor the volume arg of play_sound_* |
428 | 33 This means that all sounds are played at 100%. |
34 The gain parameter can be set by using the hp-play-gain variable. | |
35 | |
36 NOTES | |
37 This file is mostly based on the player program found in the examples | |
38 directory of the audio software delivered on our machines. The path I | |
39 found it under was /usr/audio/examples/player.c | |
40 This file contained no credits and no copyrights. The original fileheader | |
41 is given below. | |
42 HISTORY | |
43 lynbech - Feb 10, 1993: Created. | |
44 ***/ | |
45 | |
46 /* ORIGINAL FILEHEADER: | |
47 * player - command-line audio file player | |
48 * Aug. 28 1991 | |
49 * by three unknown, unsung audio programmers | |
50 * (well, only two are unsung) | |
51 */ | |
52 | |
53 #include <config.h> | |
54 #include "lisp.h" | |
55 | |
563 | 56 #include "sound.h" |
442 | 57 |
428 | 58 #include <Alib.h> |
59 #include <CUlib.h> | |
60 | |
442 | 61 |
428 | 62 Lisp_Object Vhp_play_server; |
63 Lisp_Object Vhp_play_speaker; | |
458 | 64 Fixnum hp_play_gain; |
428 | 65 |
66 /* Functions */ | |
67 | |
68 /* error handling */ | |
563 | 69 void |
2367 | 70 player_error_internal (Audio * audio, Ascbyte * text, long errorCode) |
428 | 71 { |
563 | 72 Extbyte errorbuff[132]; |
867 | 73 Ibyte *interr; |
428 | 74 |
563 | 75 AGetErrorText (audio, errorCode, errorbuff, 131); |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
76 interr = EXTERNAL_TO_ITEXT (errorbuf, Qerror_message_encoding); |
563 | 77 |
4953
304aebb79cd3
function renamings to track names of char typedefs
Ben Wing <ben@xemacs.org>
parents:
4952
diff
changeset
|
78 signal_error (Qsound_error, text, build_istring (interr)); |
428 | 79 } |
80 | |
563 | 81 long |
82 myHandler( Audio * audio, AErrorEvent * err_event) | |
428 | 83 { |
84 player_error_internal(audio, "Internal sound error", err_event->error_code); | |
85 return 1; /* Must return something, was orig. an exit */ | |
86 } | |
87 | |
88 /* Playing */ | |
89 void | |
2286 | 90 play_bucket_internal( Audio *audio, SBucket *pSBucket, long UNUSED (volume)) |
428 | 91 { |
563 | 92 SBPlayParams playParams; |
93 AGainEntry gainEntry; | |
94 ATransID xid; | |
95 long status; | |
96 | |
97 playParams.priority = APriorityNormal; /* normal priority */ | |
428 | 98 |
563 | 99 /* |
100 * We can't signal an error, because all h*ll would break loose if | |
101 * we did. | |
102 */ | |
103 if (EQ (Vhp_play_speaker, Qexternal)) | |
104 gainEntry.u.o.out_dst = AODTMonoJack; | |
105 else | |
106 gainEntry.u.o.out_dst = AODTMonoIntSpeaker; | |
428 | 107 |
563 | 108 gainEntry.u.o.out_ch = AOCTMono; |
109 gainEntry.gain = AUnityGain; | |
110 playParams.gain_matrix.type = AGMTOutput; /* gain matrix */ | |
111 playParams.gain_matrix.num_entries = 1; | |
112 playParams.gain_matrix.gain_entries = &gainEntry; | |
113 playParams.play_volume = hp_play_gain; /* play volume */ | |
114 playParams.pause_first = False; /* don't pause */ | |
115 playParams.start_offset.type = ATTSamples; /* start offset 0 */ | |
116 playParams.start_offset.u.samples = 0; | |
117 playParams.duration.type = ATTFullLength; /* play entire sample */ | |
118 playParams.loop_count = 1; /* play sample just once */ | |
119 playParams.previous_transaction = 0; /* no linked transaction */ | |
120 playParams.event_mask = 0; /* don't solicit any events */ | |
428 | 121 |
563 | 122 /* |
123 * play the sound bucket | |
124 */ | |
125 xid = APlaySBucket( audio, pSBucket, &playParams, NULL ); | |
428 | 126 |
563 | 127 /* |
128 * set close mode to prevent playback from stopping | |
129 * when we close audio connection | |
130 */ | |
131 ASetCloseDownMode( audio, AKeepTransactions, &status ); | |
428 | 132 |
563 | 133 /* |
134 * That's all, folks! | |
135 * Always destroy bucket and close connection. | |
136 */ | |
137 ADestroySBucket( audio, pSBucket, &status ); | |
138 ACloseAudio( audio, &status ); | |
428 | 139 } |
140 | |
141 void | |
563 | 142 play_sound_file (Extbyte * sound_file, int volume) |
428 | 143 { |
563 | 144 sbucket *pSBucket; |
145 Audio *audio; | |
146 long status; | |
147 AErrorHandler prevHandler; /* pointer to previous handler */ | |
148 Extbyte *server; | |
428 | 149 |
563 | 150 if (STRINGP (Vhp_play_server)) |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
151 server = LISP_STRING_TO_EXTERNAL (Vhp_play_server, |
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
152 Qunix_host_name_encoding); |
563 | 153 else |
428 | 154 server = ""; |
155 | |
563 | 156 /* |
157 * open audio connection | |
158 */ | |
159 audio = AOpenAudio( server, &status ); | |
160 if( status ) | |
161 { | |
162 player_error_internal( audio, "Open audio failed", status ); | |
428 | 163 } |
164 | |
563 | 165 /* replace default error handler */ |
166 prevHandler = ASetErrorHandler(myHandler); | |
428 | 167 |
563 | 168 /* |
169 * Load the audio file into a sound bucket | |
170 */ | |
428 | 171 |
563 | 172 pSBucket = ALoadAFile( audio, sound_file, AFFUnknown, 0, NULL, NULL ); |
428 | 173 |
563 | 174 /* |
175 * Play the bucket | |
176 */ | |
428 | 177 |
563 | 178 play_bucket_internal(audio, pSBucket, volume); |
428 | 179 |
563 | 180 ASetErrorHandler(prevHandler); |
428 | 181 } |
182 | |
183 | |
442 | 184 int |
2367 | 185 play_sound_data (Binbyte * data, int UNUSED (length), int volume) |
428 | 186 { |
563 | 187 SBucket *pSBucket; |
188 Audio *audio; | |
189 AErrorHandler prevHandler; | |
190 SunHeader *header; | |
191 long status; | |
192 Extbyte *server; | |
193 int result; | |
428 | 194 |
563 | 195 /* #### Finish this to return an error code. |
196 This function signal a lisp error. How consistent with the rest. | |
197 What if this function is needed in doing the beep for the error? | |
442 | 198 |
563 | 199 Apparently the author of this didn't read the comment in |
200 Fplay_sound. | |
201 */ | |
442 | 202 |
203 | |
563 | 204 if (STRINGP (Vhp_play_server)) |
4981
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
205 server = LISP_STRING_TO_EXTERNAL (Vhp_play_server, |
4aebb0131297
Cleanups/renaming of EXTERNAL_TO_C_STRING and friends
Ben Wing <ben@xemacs.org>
parents:
4953
diff
changeset
|
206 Qunix_host_name_encoding); |
563 | 207 else |
428 | 208 server = ""; |
209 | |
563 | 210 /* open audio connection */ |
211 audio = AOpenAudio( server, &status ); | |
212 if(status) | |
213 { | |
214 player_error_internal( audio, "Open audio failed", status ); | |
428 | 215 } |
216 | |
563 | 217 /* replace default error handler */ |
218 prevHandler = ASetErrorHandler (myHandler); | |
428 | 219 |
563 | 220 /* Create sound bucket */ |
221 header = (SunHeader *) data; | |
428 | 222 |
563 | 223 pSBucket = ACreateSBucket(audio, NULL, NULL, &status); |
224 if (status) | |
225 player_error_internal( audio, "Bucket creation failed", status ); | |
428 | 226 |
2367 | 227 APutSBucketData(audio, pSBucket, 0, (CBinbyte *) (data + header->header_size), header->data_length, &status); |
428 | 228 |
563 | 229 if (status) |
230 player_error_internal( audio, "Audio data copy failed", status ); | |
428 | 231 |
563 | 232 /* Play sound */ |
233 play_bucket_internal(audio, pSBucket, volume); | |
428 | 234 |
563 | 235 ASetErrorHandler(prevHandler); |
236 if (status) | |
237 player_error_internal( audio, "Audio data copy failed", status ); | |
442 | 238 |
563 | 239 return 1; |
428 | 240 } |
241 | |
242 void | |
243 vars_of_hpplay (void) | |
244 { | |
245 DEFVAR_LISP ("hp-play-server", &Vhp_play_server /* | |
246 A string, determining which server to play sound at. | |
247 Note that this is specific to the HP sound implementation, and you should | |
248 not make your functions depend on it. | |
249 */ ); | |
250 | |
251 Vhp_play_server = Qnil; | |
252 | |
253 DEFVAR_LISP ("hp-play-speaker", &Vhp_play_speaker /* | |
254 If this variable is the symbol `external', sound is played externally. | |
255 If the environment variable SPEAKER is set, that value is used for | |
256 initializing this variable. | |
257 Note that this is specific to the HP sound implementation, and you should | |
258 not make your functions depend on it. | |
259 */ ); | |
260 | |
261 Vhp_play_speaker = intern ("internal"); | |
262 | |
563 | 263 DEFVAR_INT ("hp-play-gain", &hp_play_gain /* |
428 | 264 Global gain value for playing sounds. |
265 Default value is AUnityGain which means keep level. | |
266 Please refer to the HP documentation, for instance in | |
267 `Using the Audio Application Program Interface', for details on how to | |
268 interpret this variable. | |
269 Note that this is specific to the HP sound implementation, and you should | |
270 not make your functions depend on it. | |
271 */ ); | |
272 | |
273 hp_play_gain = AUnityGain; | |
274 } | |
275 | |
276 void | |
277 init_hpplay (void) | |
278 { | |
771 | 279 if (egetenv ("SPEAKER")) |
280 Vhp_play_speaker = intern (egetenv ("SPEAKER")); | |
428 | 281 } |