[comp.sys.mac.programmer] How to play snds?

sl161022@silver.bacs.indiana.edu (01/25/89)

"There is no need for anyone to have a computer in their home."

                                        -- Ken Olsen, president of
                                           Digital, 1977

I program the Mac in assembly language, and appear to be the only person
in all of Bloomington to do so.  Thus, I have no recourse but to seek
experienced programmers elsewhere.

I've heard that the Inside Mac Volume V description of the Sound Manager
is badly written and self-contradictory.  After immersing myself in it
these past few days, I have no trouble believing this.  ALL I WANT TO DO
is play a particular type 2 'snd ' resource, which is a digitally-sampled
sound.  No fancy pitch changes.  No frills.  Just play the damn thing as
recorded!

The 'snd ' is loaded into memory.  It's not going anywhere.  I'm willing
to allocate my own section of memory for the SndChannel record.  I know
where that is too.  My program has already been loaded into a nice cozy
spot in the system heap, and I've redirected a trap to call my routine
first, which calls the original trap and then returns to play the sound.
I.e., whenever this particular trap gets called, my 'snd ' is to be played.

The above routine is working just fine as it is.  Right now, it merely
does a _SysBeep whenever this trap is activated.  But how in hell do
you get the Sound Manager to play the sound?  Any guidance on this
question would be dearly appreciated.


As a side question:  I want this sound to be played whenever the user
hits a key, but ONLY when TextEdit is active.  When the user is in the
Finder or anywhere else where keystrokes do not produce characters on
the screen, I do NOT want my sound to be played.  The way I'm doing this
now is by redirecting the trap _TEKey.  I haven't tested it in many
different applications yet, but this seems to work as I want it too.

Can anyone else think of a different, perhaps better, way?  (Just for
more options to consider.)

Be seeing you...
__________________________________________________________________

"May the forces of evil become confused on the way to your house."
                                                   -- George Carlin
Sincerely,
           Phaedrus
           (aka Colin Klipsch)
           sl161022@silver.bacs.indiana.edu
           Indiana University at Bloomington

bob@accuvax.nwu.edu (Bob Hablutzel) (01/26/89)

> I program the Mac in assembly language, and appear to be the only person
> in all of Bloomington to do so.  Thus, I have no recourse but to seek
> experienced programmers elsewhere.

It's always nice to hear from another assembler language nut. (But, _no_,
I will not discuss how nice assembler language is. Headaches like that
I don't need again :-))

> I've heard that the Inside Mac Volume V description of the Sound Manager
> is badly written and self-contradictory.

Apple admits that the old Sound Manager chapter is "ambiguous, inaccurate,
and often contradics itself". They have put out a new sound manager 
chapter (in Word format) which is designed to clear things up. I think it
was posted to Comp.Binaries.Mac a while back, if not I can post it.

> ALL I WANT TO DO
> is play a particular type 2 'snd ' resource, which is a digitally-sampled
> sound.  No fancy pitch changes.  No frills.  Just play the damn thing as
> recorded!

One of the first things the new document does is give the sample code for
playing a simple 'snd ' resource. They give it in Pascal:

myChan := NIL;
sndHandle := GetNamedResource( 'snd ', 'myBeep' );
myErr := SndPlay( myChan, sndHandle, FALSE );

In assembler, this would be:

	subq.l	#4,sp
	move.l	#'snd ',-(sp)
	pea	myBeep
	_GetNamedResource
	move.l	(sp)+,D0
	beq	NoGood
	tst.w	ResErr
	bne	NoGood
	
	subq.l	#2,sp
	clr.l	-(sp)
	move.l	D0,-(sp)
	sf.b	-(sp)
	_SndPlay
	tst.w	(sp)+
	bne	NoGood

> As a side question:  I want this sound to be played whenever the user
> hits a key, but ONLY when TextEdit is active.  When the user is in the
> Finder or anywhere else where keystrokes do not produce characters on
> the screen, I do NOT want my sound to be played.  The way I'm doing this
> now is by redirecting the trap _TEKey.  I haven't tested it in many
> different applications yet, but this seems to work as I want it too.

This sounds like a good way to go about things. You get the additional 
advantage that you are ensured that the heap is in a consistant state,
since TEKey can't be called when the heap isn't. (Neither can SndPlay,
I think, but IM V isn't here).

> Be seeing you...

Later

>           Phaedrus
>           (aka Colin Klipsch)
>           sl161022@silver.bacs.indiana.edu
>           Indiana University at Bloomington

Bob Hablutzel	Wildwood Software	BOB@NUACC.ACNS.NWU.EDU