Eric,
Here is a translation of what you posted (the source is actually Pascal, not C
<g>).
-------------- Pascal source --------------------
FUNCTION MyHalveFreq (mySndChan: SndChannelPtr): OSErr;
VAR
myRate: LongInt; {rate of sound play}
mySndCmd: SndCommand; {a sound command}
myErr: OSErr;
BEGIN
{Get the rate of the sample currently playing.}
mySndCmd.cmd := getRateCmd; {the command is getRateCmd}
mySndCmd.param1 := 0; {unused}
mySndCmd.param2 := LongInt(@myRate);
myErr := SndDoImmediate(mySndChan, mySndCmd);
IF myErr = noErr THEN
BEGIN
{Halve the sample rate.}
mySndCmd.cmd := rateCmd; {the command is rateCmd}
mySndCmd.param1 := 0; {unused}
mySndCmd.param2 := FixDiv(myRate, $00020000);
myErr := SndDoImmediate(mySndChan, mySndCmd);
END;
MyHalveFreq := myErr;
END;
--------------- FB translation ------------------------
CLEAR LOCAL
DIM myRate&
DIM mySndCmd.sndCSize
DIM myErr
LOCAL FN MyHalveFreq (mySndChan&)
'Get the rate of the sample currently playing.
mySndCmd.cmd% = _getRateCmd ' the command is getRateCmd}
mySndCmd.param1% = 0 ' unused}
mySndCmd.param2& = @myRate&
myErr = FN SndDoImmediate(mySndChan&, mySndCmd)
LONG IF myErr = noErr
' Halve the sample rate
mySndCmd.cmd% = _rateCmd ' the command is rateCmd
mySndCmd.param1% = 0 ' unused
mySndCmd.param2& = FN FixDiv(myRate&, &H00020000)
myErr = FN SndDoImmediate(mySndChan&, mySndCmd)
END IF
END FN = myErr
untested, but should work.
Chris Young