RecordToFile.c

#include    <Quickdraw.h>
#include    <Windows.h>
#include    <dialogs.h>
#include    <Files.h>
#include    <StandardFile.h>
#include    <OSEvents.h>
#include    <Memory.h>
#include    <Sound.h>
#include    <SoundInput.h>
#include    <OSUtils.h>
 
#define TRUE            0xFF
#define FALSE           0
 
typedef struct {
    short       OnOff;
    short       Level;
} Level;
 
pascal void MyRecComp (SPBPtr inParamPtr);
 
 
#ifdef powerc
   QDGlobals    qd;
#endif
 
main()
{
    Point               where = {20,20};
    SFReply             reply;
    short               SomeRefNum;
    Level               myLevel;
    OSErr               err;
    SPBPtr              RecordRec;
    long                SoundRefNum;
    long                totalMilRecord;
    ParmBlkPtr          paramBlock;
    SICompletionUPP     mySICompletionUPP;
 
        
    
    InitGraf(&qd.thePort);
    FlushEvents(everyEvent, 0);
    InitWindows();
    InitDialogs(nil);
    InitCursor();
    
    SFGetFile (where, "\p", nil, -1, nil, nil, &reply);
    err = FSOpen(reply.fName, reply.vRefNum, &SomeRefNum);
    if (err != noErr)
        Debugger();
        
    err = SetupAIFFHeader (SomeRefNum, 1, 0x56EE8BA3, 8, 'NONE', 0, 0);
    if (err != noErr)
        Debugger();
    
    err = SPBOpenDevice (nil, siWritePermission, &SoundRefNum);
    if (err != noErr)
        Debugger();
        
    myLevel.OnOff = 1;
    myLevel.Level = 0;
    err = SPBSetDeviceInfo (SoundRefNum,siTwosComplementOnOff, (Ptr) &myLevel);
    if (err != noErr)
        Debugger();
        
    RecordRec = (SPBPtr) NewPtr(sizeof (SPB));
    if (MemError() != noErr || RecordRec == nil)
        Debugger();
        
    /* create a SICompletionUPP */
    mySICompletionUPP = NewSICompletionProc(MyRecComp);
 
    RecordRec->inRefNum = SoundRefNum;
    RecordRec->count = 0;
    RecordRec->milliseconds = 15000;
    RecordRec->bufferLength = 0;
    RecordRec->bufferPtr = nil;
    RecordRec->completionRoutine = mySICompletionUPP;
    RecordRec->interruptRoutine = nil;
    RecordRec->userLong = 0;
    RecordRec->error = 0;
    RecordRec->unused1 = 0;
 
    err = SPBRecordToFile (SomeRefNum, RecordRec, TRUE);
    if (err != noErr)
        Debugger();
        
    do {
        } while (RecordRec->userLong == 0);
        
    totalMilRecord = 15000;
    
    err = SPBMillisecondsToBytes(SoundRefNum, &totalMilRecord);
    if (err != noErr)
        Debugger();
 
    paramBlock = (ParmBlkPtr) NewPtr(sizeof (IOParam));
    if (MemError() != noErr || paramBlock == nil)
        Debugger();
 
    paramBlock->ioParam.ioRefNum = SomeRefNum;
    paramBlock->ioParam.ioPosMode = 1;
    paramBlock->ioParam.ioPosOffset = 0;
        
    err = PBSetFPos(paramBlock, FALSE);
    if (err != noErr)
        Debugger();
 
    err = SetupAIFFHeader (SomeRefNum, 1, 0x56EE8BA3, 8, 'NONE', totalMilRecord, 0);
    if (err != noErr)
        Debugger();
    
    SPBCloseDevice (SoundRefNum);
        
    DisposePtr ((Ptr) RecordRec);
    
    err = SndStartFilePlay (nil, SomeRefNum, 0, 74000, nil, nil, nil, FALSE);
    if (err != noErr)
        Debugger();
            
    FSClose (SomeRefNum);
    
    DisposeRoutineDescriptor(mySICompletionUPP);
}
/**********************************/
 
pascal void MyRecComp (SPBPtr inParamPtr)
{
    inParamPtr->userLong = 1;
    
    return;
}
 
/**********************************/