home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pcmagazi / 1992 / 01 / record2 / record2.c < prev    next >
Text File  |  1991-12-10  |  11KB  |  259 lines

  1. /*---------------------------------------------------------
  2.    RECORD2.C -- Multimedia Windows Waveform Audio Recorder
  3.                 (c) Charles Petzold, 1991
  4.   ---------------------------------------------------------*/
  5.  
  6. #include <windows.h>
  7. #include <mmsystem.h>
  8. #include <stdio.h>
  9. #include "record2.h"
  10.  
  11. BOOL FAR PASCAL DlgProc (HWND, WORD, WORD, LONG) ;
  12.  
  13. static char szAppName [] = "Record2" ;
  14.  
  15. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  16.                     LPSTR lpszCmdLine, int nCmdShow)
  17.      {
  18.      FARPROC lpDlgProc ;
  19.  
  20.      lpDlgProc = MakeProcInstance (DlgProc, hInstance) ;
  21.      DialogBox (hInstance, szAppName, NULL, lpDlgProc) ;
  22.      FreeProcInstance (lpDlgProc) ;
  23.  
  24.      return 0 ;
  25.      }
  26.  
  27. void ShowError (HWND hwnd, DWORD dwError)
  28.      {
  29.      static char szErrorStr [80] ;
  30.  
  31.      mciGetErrorString (dwError, szErrorStr, 80) ;
  32.      MessageBeep (MB_ICONEXCLAMATION) ;
  33.      MessageBox (hwnd, szErrorStr, szAppName, MB_OK | MB_ICONEXCLAMATION) ;
  34.      }
  35.  
  36. BOOL FAR PASCAL DlgProc (HWND hwnd, WORD message, WORD wParam, LONG lParam)
  37.      {
  38.      static BOOL            bRecording, bPlaying, bPaused ;
  39.      static char            szFileName[] = "record2.wav" ;
  40.      static WORD            wDeviceID ;
  41.      DWORD                  dwError ;
  42.      MCI_GENERIC_PARMS      mciGeneric ;
  43.      MCI_OPEN_PARMS         mciOpen ;
  44.      MCI_PLAY_PARMS         mciPlay ;
  45.      MCI_WAVE_RECORD_PARMS  mciRecord ;
  46.  
  47.      switch (message)
  48.           {
  49.           case WM_COMMAND:
  50.                switch (wParam)
  51.                     {
  52.                     case ID_RECORD_BEG:
  53.                                         // Delete Existing Waveform File
  54.  
  55.                          remove (szFileName) ;
  56.  
  57.                                         // Open Waveform Audio
  58.  
  59.                          mciOpen.dwCallback       = 0L ;
  60.                          mciOpen.wDeviceID        = 0 ;
  61.                          mciOpen.wReserved0       = 0 ;
  62.                          mciOpen.lpstrDeviceType  = NULL ;
  63.                          mciOpen.lpstrElementName = szFileName ;
  64.                          mciOpen.lpstrAlias       = NULL ;
  65.  
  66.                          dwError = mciSendCommand (0, MCI_OPEN,
  67.                                         MCI_WAIT | MCI_OPEN_ELEMENT,
  68.                                         (DWORD) (LPMCI_OPEN_PARMS) &mciOpen) ;
  69.  
  70.                          if (dwError != 0L)
  71.                               {
  72.                               ShowError (hwnd, dwError) ;
  73.                               return TRUE ;
  74.                               }
  75.                                         // Save the Device ID
  76.  
  77.                          wDeviceID = mciOpen.wDeviceID ;
  78.  
  79.                                         // Begin Recording
  80.  
  81.                          mciRecord.dwCallback = hwnd ;
  82.                          mciRecord.dwFrom     = 0 ;
  83.                          mciRecord.dwTo       = 0 ;
  84.  
  85.                          mciSendCommand (wDeviceID, MCI_RECORD, MCI_NOTIFY,
  86.                               (DWORD) (LPMCI_WAVE_RECORD_PARMS) &mciRecord) ;
  87.  
  88.                                         // Change Enabled Buttons
  89.  
  90.                          EnableWindow (GetDlgItem (hwnd, ID_RECORD_BEG), FALSE);
  91.                          EnableWindow (GetDlgItem (hwnd, ID_RECORD_END), TRUE) ;
  92.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_BEG),   FALSE);
  93.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_PAUSE), FALSE);
  94.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_END),   FALSE);
  95.                          SetFocus (GetDlgItem (hwnd, ID_RECORD_END)) ;
  96.  
  97.                          bRecording = TRUE ;
  98.                          return TRUE ;
  99.  
  100.                     case ID_RECORD_END:
  101.                                         // Stop Recording
  102.  
  103.                          mciGeneric.dwCallback = 0L ;
  104.  
  105.                          mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT,
  106.                               (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ;
  107.  
  108.                                         // Save the File
  109.  
  110.                          mciSendCommand (wDeviceID, MCI_SAVE, MCI_WAIT,
  111.                               (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ;
  112.  
  113.                                         // Close the Waveform Device
  114.  
  115.                          mciSendCommand (wDeviceID, MCI_CLOSE, MCI_WAIT,
  116.                               (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ;
  117.  
  118.                                         // Change Enabled Buttons
  119.  
  120.                          EnableWindow (GetDlgItem (hwnd, ID_RECORD_BEG), TRUE) ;
  121.                          EnableWindow (GetDlgItem (hwnd, ID_RECORD_END), FALSE);
  122.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_BEG),   TRUE) ;
  123.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_PAUSE), FALSE);
  124.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_END),   FALSE);
  125.                          SetFocus (GetDlgItem (hwnd, ID_PLAY_BEG)) ;
  126.  
  127.                          bRecording = FALSE ;
  128.                          return TRUE ;
  129.  
  130.                     case ID_PLAY_BEG:
  131.                                         // Open Waveform Audio
  132.  
  133.                          mciOpen.dwCallback       = 0L ;
  134.                          mciOpen.wDeviceID        = 0 ;
  135.                          mciOpen.wReserved0       = 0 ;
  136.                          mciOpen.lpstrDeviceType  = NULL ;
  137.                          mciOpen.lpstrElementName = szFileName ;
  138.                          mciOpen.lpstrAlias       = NULL ;
  139.  
  140.                          dwError = mciSendCommand (0, MCI_OPEN,
  141.                                         MCI_WAIT | MCI_OPEN_ELEMENT,
  142.                                         (DWORD) (LPMCI_OPEN_PARMS) &mciOpen) ;
  143.  
  144.                          if (dwError != 0L)
  145.                               {
  146.                               ShowError (hwnd, dwError) ;
  147.                               return TRUE ;
  148.                               }
  149.                                         // Save the Device ID
  150.  
  151.                          wDeviceID = mciOpen.wDeviceID ;
  152.  
  153.                                         // Begin Playing
  154.  
  155.                          mciPlay.dwCallback = hwnd ;
  156.                          mciPlay.dwFrom     = 0 ;
  157.                          mciPlay.dwTo       = 0 ;
  158.  
  159.                          mciSendCommand (wDeviceID, MCI_PLAY, MCI_NOTIFY,
  160.                              (DWORD) (LPMCI_PLAY_PARMS) &mciPlay) ;
  161.  
  162.                                         // Change Enabled Buttons
  163.  
  164.                          EnableWindow (GetDlgItem (hwnd, ID_RECORD_BEG), FALSE);
  165.                          EnableWindow (GetDlgItem (hwnd, ID_RECORD_END), FALSE);
  166.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_BEG),   FALSE);
  167.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_PAUSE), TRUE) ;
  168.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_END),   TRUE) ;
  169.                          SetFocus (GetDlgItem (hwnd, ID_PLAY_END)) ;
  170.  
  171.                          bPlaying = TRUE ;
  172.                          return TRUE ;
  173.  
  174.                     case ID_PLAY_PAUSE:
  175.                          if (!bPaused)
  176.                                         // Pause the Play
  177.                               {
  178.                               mciGeneric.dwCallback = 0L ;
  179.  
  180.                               mciSendCommand (wDeviceID, MCI_PAUSE, MCI_WAIT,
  181.                                    (DWORD) (LPMCI_GENERIC_PARMS) & mciGeneric);
  182.  
  183.                               SetDlgItemText (hwnd, ID_PLAY_PAUSE, "Resume") ;
  184.                               bPaused = TRUE ;
  185.                               }
  186.                          else
  187.                                         // Begin Playing Again
  188.                               {
  189.                               mciPlay.dwCallback = hwnd ;
  190.                               mciPlay.dwFrom     = 0 ;
  191.                               mciPlay.dwTo       = 0 ;
  192.  
  193.                               mciSendCommand (wDeviceID, MCI_PLAY, MCI_NOTIFY,
  194.                                   (DWORD) (LPMCI_PLAY_PARMS) &mciPlay) ;
  195.  
  196.                               SetDlgItemText (hwnd, ID_PLAY_PAUSE, "Pause") ;
  197.                               bPaused = FALSE ;
  198.                               }
  199.  
  200.                          return TRUE ;
  201.  
  202.                     case ID_PLAY_END:
  203.                                         // Stop and Close
  204.  
  205.                          mciGeneric.dwCallback = 0L ;
  206.  
  207.                          mciSendCommand (wDeviceID, MCI_STOP, MCI_WAIT,
  208.                               (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ;
  209.  
  210.                          mciSendCommand (wDeviceID, MCI_CLOSE, MCI_WAIT,
  211.                               (DWORD) (LPMCI_GENERIC_PARMS) &mciGeneric) ;
  212.  
  213.                                         // Change Enabled Buttons
  214.  
  215.                          EnableWindow (GetDlgItem (hwnd, ID_RECORD_BEG), TRUE) ;
  216.                          EnableWindow (GetDlgItem (hwnd, ID_RECORD_END), FALSE);
  217.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_BEG),   TRUE) ;
  218.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_PAUSE), FALSE);
  219.                          EnableWindow (GetDlgItem (hwnd, ID_PLAY_END),   FALSE);
  220.                          SetFocus (GetDlgItem (hwnd, ID_PLAY_BEG)) ;
  221.  
  222.                          bPlaying = FALSE ;
  223.                          bPaused  = FALSE ;
  224.                          return TRUE ;
  225.                     }
  226.                break ;
  227.  
  228.           case MM_MCINOTIFY:
  229.                switch (wParam)
  230.                     {
  231.                     case MCI_NOTIFY_SUCCESSFUL:
  232.                          if (bPlaying)
  233.                               SendMessage (hwnd, WM_COMMAND, ID_PLAY_END, 0L) ;
  234.  
  235.                          if (bRecording)
  236.                               SendMessage (hwnd, WM_COMMAND, ID_RECORD_END, 0L);
  237.  
  238.                          return TRUE ;
  239.                     }
  240.                break ;
  241.  
  242.           case WM_SYSCOMMAND:
  243.                switch (wParam)
  244.                     {
  245.                     case SC_CLOSE:
  246.                          if (bRecording)
  247.                               SendMessage (hwnd, WM_COMMAND, ID_RECORD_END, 0L) ;
  248.  
  249.                          if (bPlaying)
  250.                               SendMessage (hwnd, WM_COMMAND, ID_PLAY_END, 0L) ;
  251.  
  252.                          EndDialog (hwnd, 0) ;
  253.                          return TRUE ;
  254.                     }
  255.                break ;
  256.           }
  257.      return FALSE ;
  258.      }
  259.