Mercurial > hg > xemacs-beta
annotate src/hpplay.c @ 5146:88bd4f3ef8e4
make lrecord UID's have a separate UID space for each object, resurrect debug SOE code in extents.c
-------------------- ChangeLog entries follow: --------------------
src/ChangeLog addition:
2010-03-15 Ben Wing <ben@xemacs.org>
* alloc.c:
* alloc.c (c_readonly):
* alloc.c (deadbeef_memory):
* alloc.c (make_compiled_function):
* alloc.c (make_button_data):
* alloc.c (make_motion_data):
* alloc.c (make_process_data):
* alloc.c (make_timeout_data):
* alloc.c (make_magic_data):
* alloc.c (make_magic_eval_data):
* alloc.c (make_eval_data):
* alloc.c (make_misc_user_data):
* alloc.c (noseeum_make_marker):
* alloc.c (ADDITIONAL_FREE_string):
* alloc.c (common_init_alloc_early):
* alloc.c (init_alloc_once_early):
* bytecode.c (print_compiled_function):
* bytecode.c (mark_compiled_function):
* casetab.c:
* casetab.c (print_case_table):
* console.c:
* console.c (print_console):
* database.c (print_database):
* database.c (finalize_database):
* device-msw.c (sync_printer_with_devmode):
* device-msw.c (print_devmode):
* device-msw.c (finalize_devmode):
* device.c:
* device.c (print_device):
* elhash.c:
* elhash.c (print_hash_table):
* eval.c (print_multiple_value):
* eval.c (mark_multiple_value):
* events.c (deinitialize_event):
* events.c (print_event):
* events.c (event_equal):
* extents.c:
* extents.c (soe_dump):
* extents.c (soe_insert):
* extents.c (soe_delete):
* extents.c (soe_move):
* extents.c (extent_fragment_update):
* extents.c (print_extent_1):
* extents.c (print_extent):
* extents.c (vars_of_extents):
* frame.c:
* frame.c (print_frame):
* free-hook.c:
* free-hook.c (check_free):
* glyphs.c:
* glyphs.c (print_image_instance):
* glyphs.c (print_glyph):
* gui.c:
* gui.c (copy_gui_item):
* hash.c:
* hash.c (NULL_ENTRY):
* hash.c (KEYS_DIFFER_P):
* keymap.c (print_keymap):
* keymap.c (MARKED_SLOT):
* lisp.h:
* lrecord.h:
* lrecord.h (LISP_OBJECT_UID):
* lrecord.h (set_lheader_implementation):
* lrecord.h (struct old_lcrecord_header):
* lstream.c (print_lstream):
* lstream.c (finalize_lstream):
* marker.c (print_marker):
* marker.c (marker_equal):
* mc-alloc.c (visit_all_used_page_headers):
* mule-charset.c:
* mule-charset.c (print_charset):
* objects.c (print_color_instance):
* objects.c (print_font_instance):
* objects.c (finalize_font_instance):
* opaque.c (print_opaque):
* opaque.c (print_opaque_ptr):
* opaque.c (equal_opaque_ptr):
* print.c (internal_object_printer):
* print.c (enum printing_badness):
* rangetab.c (print_range_table):
* rangetab.c (range_table_equal):
* specifier.c (print_specifier):
* specifier.c (finalize_specifier):
* symbols.c:
* symbols.c (print_symbol_value_magic):
* tooltalk.c:
* tooltalk.c (print_tooltalk_message):
* tooltalk.c (print_tooltalk_pattern):
* window.c (print_window):
* window.c (debug_print_window):
(1) Make lrecord UID's have a separate UID space for each object.
Otherwise, with 20-bit UID's, we rapidly wrap around, especially
when common objects like conses and strings increment the UID value
for every object created. (Originally I tried making two UID spaces,
one for objects that always print readably and hence don't display
the UID, and one for other objects. But certain objects like markers
for which a UID is displayed are still generated rapidly enough that
UID overflow is a serious issue.) This also has the advantage of
making UID values smaller, hence easier to remember -- their main
purpose is to make it easier to keep track of different objects of
the same type when debugging code. Make sure we dump lrecord UID's
so that we don't have problems with pdumped and non-dumped objects
having the same UID.
(2) Display UID's consistently whenever an object (a) doesn't
consistently print readably (objects like cons and string, which
always print readably, can't display a UID), and (b) doesn't
otherwise have a unique property that makes objects of a
particular type distinguishable. (E.g. buffers didn't and still
don't print an ID, but the buffer name uniquely identifies the
buffer.) Some types, such as event, extent, compiled-function,
didn't always (or didn't ever) display an ID; others (such as
marker, extent, lstream, opaque, opaque-ptr, any object using
internal_object_printer()) used to display the actual machine
pointer instead.
(3) Rename NORMAL_LISP_OBJECT_UID to LISP_OBJECT_UID; make it work
over all Lisp objects and take a Lisp object, not a struct pointer.
(4) Some misc cleanups in alloc.c, elhash.c.
(5) Change code in events.c that "deinitializes" an event so that
it doesn't increment the event UID counter in the process. Also
use deadbeef_memory() to overwrite memory instead of doing the same
with custom code. In the process, make deadbeef_memory() in
alloc.c always available, and delete extraneous copy in mc-alloc.c.
Also capitalize all uses of 0xDEADBEEF. Similarly in elhash.c
call deadbeef_memory().
(6) Resurrect "debug SOE" code in extents.c. Make it conditional
on DEBUG_XEMACS and on a `debug-soe' variable, rather than on
SOE_DEBUG. Make it output to stderr, not stdout.
(7) Delete some custom print methods that were identical to
external_object_printer().
author | Ben Wing <ben@xemacs.org> |
---|---|
date | Mon, 15 Mar 2010 16:35:38 -0500 |
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 } |