home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1994 August: Tool Chest / Dev.CD Aug 94.toast / Sample Code / Snippets / Toolbox / 2BufRecordBufferCmd / 2BufRecordBufferCmd.c next >
Encoding:
C/C++ Source or Header  |  1992-07-15  |  4.0 KB  |  186 lines  |  [TEXT/MPS ]

  1. #include    <Quickdraw.h>
  2. #include    <Windows.h>
  3. #include    <dialogs.h>
  4. #include    <OSEvents.h>
  5. #include    <Memory.h>
  6. #include    <Packages.h>
  7. #include    <Sound.h>
  8. #include    <SoundInput.h>
  9. #include    <OSUtils.h>
  10.  
  11. #define    TRUE            0xFF
  12. #define    FALSE            0
  13. #define buffSize        0x10000
  14.  
  15. typedef struct {
  16.     short        OnOff;
  17.     short         Level;
  18. } Level;
  19.  
  20.  
  21. pascal void MyRecComp (SPBPtr inParamPtr);
  22.  
  23. main()
  24. {
  25.     OSErr                err;
  26.     SPBPtr                RecordRec;
  27.     long                SoundRefNum;
  28.     Handle                Buffer, Buffer2;
  29.     SndChannelPtr        chan;
  30.     Level                myLevel;
  31.     short                headerlength, headerlength2, dummy;
  32.     Fixed                sampleRate;
  33.     SndCommand            mycmd;
  34.     
  35.     err = SPBOpenDevice ('', siWritePermission, &SoundRefNum);
  36.     if (err != noErr)
  37.         Debugger();
  38.         
  39.     myLevel.OnOff = 0;
  40.     myLevel.Level = 0;
  41.     err = SPBSetDeviceInfo (SoundRefNum,siPlayThruOnOff, (Ptr) &myLevel);
  42.     if (err != noErr)
  43.         Debugger();
  44.         
  45.     myLevel.OnOff = 0;
  46.     myLevel.Level = 0;
  47.     err = SPBSetDeviceInfo (SoundRefNum,siTwosComplementOnOff, (Ptr) &myLevel);
  48.     if (err != noErr)
  49.         Debugger();
  50.         
  51.     err = SPBGetDeviceInfo (SoundRefNum,siSampleRate, (Ptr) &sampleRate);
  52.     if (err != noErr)
  53.         Debugger();
  54.         
  55.     RecordRec = (SPBPtr) NewPtr(sizeof (SPB));
  56.     if (MemError() != noErr || RecordRec == nil)
  57.         Debugger();
  58.  
  59.     Buffer = NewHandle(buffSize);
  60.     if (MemError() != noErr || Buffer == nil)
  61.         Debugger();
  62.     HLock (Buffer);
  63.  
  64.     err = SetupSndHeader (Buffer, 1, sampleRate, 8, 'NONE', 0x3C, 0, &headerlength);
  65.     if (err != noErr)
  66.         Debugger();
  67.     err = SetupSndHeader (Buffer, 1, sampleRate, 8, 'NONE', 0x3C, buffSize - headerlength, &dummy);
  68.     if (err != noErr)
  69.         Debugger();
  70.  
  71.     Buffer2 = NewHandle(buffSize);
  72.     if (MemError() != noErr || Buffer2 == nil)
  73.         Debugger();
  74.     HLock (Buffer2);
  75.  
  76.     err = SetupSndHeader (Buffer2, 1, sampleRate, 8, 'NONE', 0x3C, 0, &headerlength2);
  77.     if (err != noErr)
  78.         Debugger();
  79.         
  80.     err = SetupSndHeader (Buffer2, 1, sampleRate, 8, 'NONE', 0x3C, buffSize - headerlength2, &dummy);
  81.     if (err != noErr)
  82.         Debugger();
  83.         
  84.     RecordRec->inRefNum = SoundRefNum;
  85.     RecordRec->count = 0;
  86.     RecordRec->milliseconds = 15000;
  87.     RecordRec->bufferLength = buffSize - headerlength;
  88.     RecordRec->bufferPtr = (Ptr) ((*Buffer) + headerlength);
  89.     RecordRec->completionRoutine = (ProcPtr) &MyRecComp;
  90.     RecordRec->interruptRoutine = nil;
  91.     RecordRec->userLong = 0;
  92.     RecordRec->error = 0;
  93.     RecordRec->unused1 = 0;
  94.  
  95.     chan = nil;
  96.     err = SndNewChannel (&chan, sampledSynth, 0, nil);
  97.     if (err != noErr)
  98.         Debugger();
  99.         
  100.     do {
  101.         err = SPBRecord (RecordRec, TRUE);
  102.         if (err != noErr)
  103.             Debugger();
  104.             
  105.         do {
  106.             } while (RecordRec->userLong == 0);
  107.         
  108.         if (RecordRec->userLong == 10) {
  109.             if (RecordRec->bufferPtr == (Ptr) ((*Buffer) + headerlength)) {
  110.                 RecordRec->bufferPtr = (Ptr) ((*Buffer2) + headerlength2);
  111.     
  112.                 mycmd.cmd = quietCmd;
  113.                 mycmd.param1 = 0;
  114.                 mycmd.param2 = 0;
  115.     
  116.                 err = SndDoCommand (chan, &mycmd, FALSE);
  117.                 if (err != noErr)
  118.                     Debugger();
  119.  
  120.                 mycmd.cmd = bufferCmd;
  121.                 mycmd.param1 = 0;
  122.                 mycmd.param2 = (long) ((*Buffer) + 20 /*headerlength2*/);
  123.     
  124.                 err = SndDoCommand (chan, &mycmd, FALSE);
  125.                 if (err != noErr)
  126.                     Debugger();
  127.  
  128.                 }
  129.             else {
  130.                 RecordRec->bufferPtr = (Ptr) ((*Buffer) + headerlength);
  131.     
  132.                 mycmd.cmd = quietCmd;
  133.                 mycmd.param1 = 0;
  134.                 mycmd.param2 = 0;
  135.     
  136.                 err = SndDoCommand (chan, &mycmd, FALSE);
  137.                 if (err != noErr)
  138.                     Debugger();
  139.     
  140.                 mycmd.cmd = bufferCmd;
  141.                 mycmd.param1 = 0;
  142.                 mycmd.param2 = (long) ((*Buffer2) + 20 /*headerlength2*/);
  143.     
  144.                 err = SndDoCommand (chan, &mycmd, FALSE);
  145.                 if (err != noErr)
  146.                     Debugger();
  147.  
  148.                 }
  149.             RecordRec->userLong = 0;
  150.             } 
  151.         } while (RecordRec->userLong != 1);
  152.         
  153.     mycmd.cmd = quietCmd;
  154.     mycmd.param1 = 0;
  155.     mycmd.param2 = 0;
  156.     
  157.     err = SndDoImmediate (chan, &mycmd);
  158.     if (err != noErr)
  159.         Debugger();
  160.  
  161.     err = SndDisposeChannel (chan,FALSE);
  162.     if (err != noErr)
  163.         Debugger();
  164.  
  165.     SPBCloseDevice (SoundRefNum);
  166.         
  167.     HUnlock (Buffer);
  168.     HUnlock (Buffer2);
  169.     DisposeHandle (Buffer);
  170.     DisposeHandle (Buffer2);
  171.     DisposePtr ((Ptr) RecordRec);
  172. }
  173. /**********************************/
  174.  
  175. pascal void MyRecComp (SPBPtr inParamPtr)
  176. {
  177.     inParamPtr->userLong = 10;    
  178.     
  179.     if (Button())
  180.         inParamPtr->userLong = 1;    
  181.     
  182.     return;
  183. }
  184.  
  185. /**********************************/
  186.