|
33 | 33 | (cond ((equal *default-sf-dir* "") (setf *default-sf-dir* path))))
|
34 | 34 |
|
35 | 35 | ;; s-save -- saves a file
|
| 36 | +(setf *in-s-save* nil) |
36 | 37 | (setf NY:ALL 1000000000) ; 1GIG constant for maxlen
|
37 | 38 | (defmacro s-save (expression &optional (maxlen NY:ALL) filename
|
38 | 39 | &key (format '*default-sf-format*)
|
|
42 | 43 | `(let ((ny:fname ,filename)
|
43 | 44 | (ny:maxlen ,maxlen)
|
44 | 45 | (ny:endian ,endian)
|
45 |
| - (ny:swap 0)) |
46 |
| - ; allow caller to omit maxlen, in which case the filename will |
47 |
| - ; be a string in the maxlen parameter position and filename will be null |
48 |
| - (cond ((null ny:fname) |
49 |
| - (cond ((stringp ny:maxlen) |
50 |
| - (setf ny:fname ny:maxlen) |
51 |
| - (setf ny:maxlen NY:ALL)) |
52 |
| - (t |
53 |
| - (setf ny:fname *default-sound-file*))))) |
| 46 | + (ny:swap 0) |
| 47 | + max-sample) ; return value |
| 48 | + (cond (*in-s-save* |
| 49 | + (error "Recursive call to s-save (maybe play?) detected!"))) |
| 50 | + (progv '(*in-s-save*) '(t) |
| 51 | + ; allow caller to omit maxlen, in which case the filename will |
| 52 | + ; be a string in the maxlen parameter position and filename will be null |
| 53 | + (cond ((null ny:fname) |
| 54 | + (cond ((stringp ny:maxlen) |
| 55 | + (setf ny:fname ny:maxlen) |
| 56 | + (setf ny:maxlen NY:ALL)) |
| 57 | + (t |
| 58 | + (setf ny:fname *default-sound-file*))))) |
54 | 59 |
|
55 |
| - (cond ((equal ny:fname "") |
56 |
| - (cond ((not ,play) |
57 |
| - (format t "s-save: no file to write! play option is off!\n")))) |
58 |
| - (t |
59 |
| - (setf ny:fname (soundfilename ny:fname)) |
60 |
| - (format t "Saving sound file to ~A~%" ny:fname))) |
61 |
| - (cond ((eq ny:endian :big) |
62 |
| - (setf ny:swap (if (bigendianp) 0 1))) |
63 |
| - ((eq ny:endian :little) |
64 |
| - (setf ny:swap (if (bigendianp) 1 0)))) |
65 |
| - (snd-save ',expression ny:maxlen ny:fname ,format ,mode ,bits ny:swap ,play))) |
| 60 | + (cond ((equal ny:fname "") |
| 61 | + (cond ((not ,play) |
| 62 | + (format t "s-save: no file to write! play option is off!\n")))) |
| 63 | + (t |
| 64 | + (setf ny:fname (soundfilename ny:fname)) |
| 65 | + (format t "Saving sound file to ~A~%" ny:fname))) |
| 66 | + (cond ((eq ny:endian :big) |
| 67 | + (setf ny:swap (if (bigendianp) 0 1))) |
| 68 | + ((eq ny:endian :little) |
| 69 | + (setf ny:swap (if (bigendianp) 1 0)))) |
| 70 | + ; print device info the first time sound is played |
| 71 | + (cond (,play |
| 72 | + (cond ((not (boundp '*snd-list-devices*)) |
| 73 | + (setf *snd-list-devices* t))))) ; one-time show |
| 74 | + (setf max-sample |
| 75 | + (snd-save ',expression ny:maxlen ny:fname ,format |
| 76 | + ,mode ,bits ny:swap ,play)) |
| 77 | + ; more information if *snd-list-devices* was unbound: |
| 78 | + (cond (,play |
| 79 | + (cond (*snd-list-devices* |
| 80 | + (format t "\nSet *snd-list-devices* = t\n~A\n~A\n~A\n~A\n\n" |
| 81 | + " and call play to see device list again." |
| 82 | + "Set *snd-device* to a fixnum to select an output device" |
| 83 | + " or set *snd-device* to a substring of a device name" |
| 84 | + " to select the first device containing the substring."))) |
| 85 | + (setf *snd-list-devices* nil))) ; normally nil |
| 86 | + max-sample))) |
66 | 87 |
|
67 | 88 | ;; MULTICHANNEL-MAX -- find peak over all channels
|
68 | 89 | ;;
|
|
217 | 238 | (local-to-global 0) format nchans mode bits swap srate
|
218 | 239 | dur)))
|
219 | 240 |
|
| 241 | + |
220 | 242 | ;; SF-INFO -- print sound file info
|
221 | 243 | ;;
|
222 | 244 | (defun sf-info (filename)
|
223 | 245 | (let (s format channels mode bits swap srate dur flags)
|
224 | 246 | (format t "~A:~%" (soundfilename filename))
|
225 | 247 | (setf s (s-read filename))
|
226 |
| - (setf format (car *rslt*)) |
227 |
| - (setf channels (cadr *rslt*)) |
228 |
| - (setf mode (caddr *rslt*)) |
229 |
| - (setf bits (cadddr *rslt*)) |
230 |
| - (setf *rslt* (cddddr *rslt*)) |
231 |
| - (setf swap (car *rslt*)) |
232 |
| - (setf srate (cadr *rslt*)) |
233 |
| - (setf dur (caddr *rslt*)) |
234 |
| - (setf flags (cadddr *rslt*)) |
| 248 | + (setf format (snd-read-format *rslt*)) |
| 249 | + (setf channels (snd-read-channels *rslt*)) |
| 250 | + (setf mode (snd-read-mode *rslt*)) |
| 251 | + (setf bits (snd-read-bits *rslt*)) |
| 252 | + ; (setf swap (snd-read-swap *rslt*)) |
| 253 | + (setf srate (snd-read-srate *rslt*)) |
| 254 | + (setf dur (snd-read-dur *rslt*)) |
| 255 | + (setf flags (snd-read-flags *rslt*)) |
235 | 256 | (format t "Format: ~A~%"
|
236 | 257 | (nth format '("none" "AIFF" "IRCAM" "NeXT" "Wave" "PAF" "SVX"
|
237 | 258 | "NIST" "VOC" "W64" "MAT4" "Mat5" "PVF" "XI" "HTK"
|
|
290 | 311 | filename)
|
291 | 312 |
|
292 | 313 |
|
293 |
| -(setfn s-read-format car) |
294 |
| -(setfn s-read-channels cadr) |
295 |
| -(setfn s-read-mode caddr) |
296 |
| -(setfn s-read-bits cadddr) |
297 |
| -(defun s-read-swap (rslt) (car (cddddr rslt))) |
298 |
| -(defun s-read-srate (rslt) (cadr (cddddr rslt))) |
299 |
| -(defun s-read-dur (rslt) (caddr (cddddr rslt))) |
300 |
| -(defun s-read-byte-offset (rslt) (car (cddddr (cddddr rslt)))) |
| 314 | +(setfn snd-read-format car) |
| 315 | +(setfn snd-read-channels cadr) |
| 316 | +(setfn snd-read-mode caddr) |
| 317 | +(setfn snd-read-bits cadddr) |
| 318 | +(defun snd-read-swap (rslt) (car (cddddr rslt))) |
| 319 | +(defun snd-read-srate (rslt) (cadr (cddddr rslt))) |
| 320 | +(defun snd-read-dur (rslt) (caddr (cddddr rslt))) |
| 321 | +(defun snd-read-flags (rslt) (cadddr (cddddr rslt))) |
| 322 | +(defun snd-read-byte-offset (rslt) (cadr (cddddr (cddddr rslt)))) |
301 | 323 |
|
302 | 324 | ;; round is tricky because truncate rounds toward zero as does C
|
303 | 325 | ;; in other words, rounding is down for positive numbers and up
|
|
328 | 350 | :time-offset ny:offset)
|
329 | 351 | ny:addend)
|
330 | 352 | ny:addend))
|
331 |
| - ,maxlen ny:fname ny:offset SND-HEAD-NONE 0 0 0 0.0)) |
| 353 | + ,maxlen ny:fname ny:offset SND-HEAD-NONE 0 0 0)) |
332 | 354 | (format t "Duration written: ~A~%" (car *rslt*))
|
333 | 355 | ny:peak))
|
334 | 356 |
|
|
338 | 360 | (ny:peak 0.0)
|
339 | 361 | ny:input ny:rslt (ny:offset ,time-offset))
|
340 | 362 | (format t "Overwriting ~A at offset ~A~%" ny:fname ny:offset)
|
341 |
| - (setf ny:offset (s-read-byte-offset ny:rslt)) |
| 363 | + (setf ny:offset (snd-read-byte-offset ny:rslt)) |
342 | 364 | (setf ny:peak (snd-overwrite `,expr ,maxlen ny:fname ny:offset
|
343 |
| - SND-HEAD-NONE 0 0 0 0.0)) |
| 365 | + SND-HEAD-NONE 0 0 0)) |
344 | 366 | (format t "Duration written: ~A~%" (car *rslt*))
|
345 | 367 | ny:peak))
|
346 | 368 |
|
|
0 commit comments