Mercurial > hg > xemacs-beta
annotate src/hpplay.c @ 4917:fce43cb76a1c
xlike cleanup, documentation
-------------------- ChangeLog entries follow: --------------------
man/ChangeLog addition:
2010-02-03 Ben Wing <ben@xemacs.org>
* internals/internals.texi (Top):
* internals/internals.texi (Evaluation; Stack Frames; Bindings):
* internals/internals.texi (Ben's README):
* internals/internals.texi (Consoles; Devices; Frames; Windows):
* internals/internals.texi (Window Hierarchy):
* internals/internals.texi (The Window Object):
* internals/internals.texi (Modules for the Basic Displayable Lisp Objects):
* internals/internals.texi (Window-System Support):
* internals/internals.texi (Creating a Window-System Type):
* internals/internals.texi (Discussion -- Garbage Collection):
Update the part at the top about how to maintain the file with
more tips.
Add a chapter on "window-system support" describing in a general
way how the support for different window systems/device types
works, including the separation between device-independent and
device-dependent parts, device methods, the specific device types
and the "xlike" pseudo-type.
src/ChangeLog addition:
2010-02-03 Ben Wing <ben@xemacs.org>
* Makefile.in.in:
* Makefile.in.in (x_objs):
* Makefile.in.in (gtk_gui_objs):
* console-xlike-inc.h:
* depend:
* device-x.c:
* emacs.c:
* gccache-gtk.h:
* gccache-gtk.h (gc_cache_lookup):
* gccache-x.c:
* gccache-x.c (GCCACHE_HASH):
* gccache-x.h:
* toolbar-gtk.c:
* toolbar-gtk.c (gtk_initialize_frame_toolbars):
* toolbar-x.c:
* toolbar-x.c (x_initialize_frame_toolbars):
* toolbar-xlike.c:
* toolbar-xlike.c (xlike_draw_blank_toolbar_button):
* toolbar-xlike.c (xlike_output_toolbar_button):
* toolbar-xlike.c (xlike_get_button_size):
* toolbar-xlike.c (XLIKE_OUTPUT_BUTTONS_LOOP):
* toolbar-xlike.c (xlike_output_toolbar):
* toolbar-xlike.c (xlike_clear_toolbar):
* toolbar-xlike.c (xlike_output_frame_toolbars):
* toolbar-xlike.c (xlike_clear_frame_toolbars):
* toolbar-xlike.c (xlike_redraw_exposed_toolbar):
* toolbar-xlike.c (xlike_redraw_exposed_toolbars):
* toolbar-xlike.c (xlike_redraw_frame_toolbars):
* toolbar-xlike.h:
* toolbar-xlike.h (xlike_clear_frame_toolbars):
Rename some files to make them consistent with general naming rules:
xgccache.c -> gccache-x.c
xgccache.h -> gccache-x.h
toolbar-common.c -> toolbar-xlike.c
toolbar-common.h -> toolbar-xlike.h
Fix include-file references. Also change the names of functions
in now-named toolbar-xlike.c to be xlike_foo() instead of common_foo().
Add a longish comment in console-xlike-inc.h describing the "xlike"
system, how it works and what the various files are used for.
| author | Ben Wing <ben@xemacs.org> |
|---|---|
| date | Wed, 03 Feb 2010 02:46:50 -0600 |
| parents | b3ea9c582280 |
| children | 19a72041c5ed |
| 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); |
|
4834
b3ea9c582280
Use new cygwin_conv_path API with Cygwin 1.7 for converting names between Win32 and POSIX, UTF-8-aware, with attendant changes elsewhere
Ben Wing <ben@xemacs.org>
parents:
4759
diff
changeset
|
76 EXTERNAL_TO_C_STRING (errorbuf, interr, Qerror_message_encoding); |
| 563 | 77 |
| 78 signal_error (Qsound_error, text, build_string (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)) |
|
4834
b3ea9c582280
Use new cygwin_conv_path API with Cygwin 1.7 for converting names between Win32 and POSIX, UTF-8-aware, with attendant changes elsewhere
Ben Wing <ben@xemacs.org>
parents:
4759
diff
changeset
|
151 LISP_STRING_TO_EXTERNAL (Vhp_play_server, server, |
|
b3ea9c582280
Use new cygwin_conv_path API with Cygwin 1.7 for converting names between Win32 and POSIX, UTF-8-aware, with attendant changes elsewhere
Ben Wing <ben@xemacs.org>
parents:
4759
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)) |
|
4834
b3ea9c582280
Use new cygwin_conv_path API with Cygwin 1.7 for converting names between Win32 and POSIX, UTF-8-aware, with attendant changes elsewhere
Ben Wing <ben@xemacs.org>
parents:
4759
diff
changeset
|
205 LISP_STRING_TO_EXTERNAL (Vhp_play_server, server, |
|
b3ea9c582280
Use new cygwin_conv_path API with Cygwin 1.7 for converting names between Win32 and POSIX, UTF-8-aware, with attendant changes elsewhere
Ben Wing <ben@xemacs.org>
parents:
4759
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 } |
