《Windows程序设计》上面有源代码,非常详细的说明!!!

解决方案 »

  1.   

    /*----------------------------------------
       RECORD1.C -- Waveform Audio Recorder
                    (c) Charles Petzold, 1998
      ----------------------------------------*/#include <windows.h>
    #include "resource.h"#define INP_BUFFER_SIZE 16384BOOL CALLBACK DlgProc (HWND, UINT, WPARAM, LPARAM) ;TCHAR szAppName [] = TEXT ("Record1") ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        PSTR szCmdLine, int iCmdShow)
    {
         if (-1 == DialogBox (hInstance, TEXT ("Record"), NULL, DlgProc))
         {
              MessageBox (NULL, TEXT ("This program requires Windows NT!"),
                          szAppName, MB_ICONERROR) ;
         }
         return 0 ;
    }void ReverseMemory (BYTE * pBuffer, int iLength)
    {
         BYTE b ;
         int  i ;
         
         for (i = 0 ; i < iLength / 2 ; i++)
         {
              b = pBuffer [i] ;
              pBuffer [i] = pBuffer [iLength - i - 1] ;
              pBuffer [iLength - i - 1] = b ;
         }
    }
      

  2.   

    BOOL CALLBACK DlgProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
         static BOOL         bRecording, bPlaying, bReverse, bPaused,
                             bEnding, bTerminating ;
         static DWORD        dwDataLength, dwRepetitions = 1 ;
         static HWAVEIN      hWaveIn ;
         static HWAVEOUT     hWaveOut ;
         static PBYTE        pBuffer1, pBuffer2, pSaveBuffer, pNewBuffer ;
         static PWAVEHDR     pWaveHdr1, pWaveHdr2 ;
         static TCHAR        szOpenError[] = TEXT ("Error opening waveform audio!");
         static TCHAR        szMemError [] = TEXT ("Error allocating memory!") ;
         static WAVEFORMATEX waveform ;
         
         switch (message)
         {
         case WM_INITDIALOG:
                   // Allocate memory for wave header
              
              pWaveHdr1 = malloc (sizeof (WAVEHDR)) ;
              pWaveHdr2 = malloc (sizeof (WAVEHDR)) ;
              
                   // Allocate memory for save buffer
              
              pSaveBuffer = malloc (1) ;
              return TRUE ;
      

  3.   

    case WM_COMMAND:
              switch (LOWORD (wParam))
              {
              case IDC_RECORD_BEG:
                        // Allocate buffer memory               pBuffer1 = malloc (INP_BUFFER_SIZE) ;
                   pBuffer2 = malloc (INP_BUFFER_SIZE) ;
                   
                   if (!pBuffer1 || !pBuffer2)
                   {
                        if (pBuffer1) free (pBuffer1) ;
                        if (pBuffer2) free (pBuffer2) ;                    MessageBeep (MB_ICONEXCLAMATION) ;
                        MessageBox (hwnd, szMemError, szAppName,
                                          MB_ICONEXCLAMATION | MB_OK) ;
                        return TRUE ;
                   }
                   
                        // Open waveform audio for input
                   
                   waveform.wFormatTag      = WAVE_FORMAT_PCM ;
                   waveform.nChannels       = 1 ;
                   waveform.nSamplesPerSec  = 11025 ;
                   waveform.nAvgBytesPerSec = 11025 ;
                   waveform.nBlockAlign     = 1 ;
                   waveform.wBitsPerSample  = 8 ;
                   waveform.cbSize          = 0 ;
                   
                   if (waveInOpen (&hWaveIn, WAVE_MAPPER, &waveform, 
                                   (DWORD) hwnd, 0, CALLBACK_WINDOW))
                   {
                        free (pBuffer1) ;
                        free (pBuffer2) ;
                        MessageBeep (MB_ICONEXCLAMATION) ;
                        MessageBox (hwnd, szOpenError, szAppName,
                                          MB_ICONEXCLAMATION | MB_OK) ;
                   }
                        // Set up headers and prepare them
                   
                   pWaveHdr1->lpData          = pBuffer1 ;
                   pWaveHdr1->dwBufferLength  = INP_BUFFER_SIZE ;
                   pWaveHdr1->dwBytesRecorded = 0 ;
                   pWaveHdr1->dwUser          = 0 ;
                   pWaveHdr1->dwFlags         = 0 ;
                   pWaveHdr1->dwLoops         = 1 ;
                   pWaveHdr1->lpNext          = NULL ;
                   pWaveHdr1->reserved        = 0 ;               waveInPrepareHeader (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ;
              
                   pWaveHdr2->lpData          = pBuffer2 ;
                   pWaveHdr2->dwBufferLength  = INP_BUFFER_SIZE ;
                   pWaveHdr2->dwBytesRecorded = 0 ;
                   pWaveHdr2->dwUser          = 0 ;
                   pWaveHdr2->dwFlags         = 0 ;
                   pWaveHdr2->dwLoops         = 1 ;
                   pWaveHdr2->lpNext          = NULL ;
                   pWaveHdr2->reserved        = 0 ;
              
                   waveInPrepareHeader (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ;
                   return TRUE ;
      

  4.   

    代码好像不完整吧,ReverseMemory()函数是干什么用的?
    我想,在主函数中调用的创建的dialogbox对话框是进行录音的窗口吧,在, DlgProc中如何使用waveIn系列AIP?
      

  5.   

    case IDC_RECORD_END:
                        // Reset input to return last buffer
                   
                   bEnding = TRUE ;
                   waveInReset (hWaveIn) ;
                   return TRUE ;
                   
              case IDC_PLAY_BEG:
                        // Open waveform audio for output
                   
                   waveform.wFormatTag      = WAVE_FORMAT_PCM ;
                   waveform.nChannels       = 1 ;
                   waveform.nSamplesPerSec  = 11025 ;
                   waveform.nAvgBytesPerSec = 11025 ;
                   waveform.nBlockAlign     = 1 ;
                   waveform.wBitsPerSample  = 8 ;
                   waveform.cbSize          = 0 ;
                   
                   if (waveOutOpen (&hWaveOut, WAVE_MAPPER, &waveform, 
                                    (DWORD) hwnd, 0, CALLBACK_WINDOW))
                   {
                        MessageBeep (MB_ICONEXCLAMATION) ;
                        MessageBox (hwnd, szOpenError, szAppName,
                             MB_ICONEXCLAMATION | MB_OK) ;
                   }
                   return TRUE ;
                   
              case IDC_PLAY_PAUSE:
                        // Pause or restart output
                   
                   if (!bPaused)
                   {
                        waveOutPause (hWaveOut) ;
                        SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Resume")) ;
                        bPaused = TRUE ;
                   }
                   else
                   {
                        waveOutRestart (hWaveOut) ;
                        SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Pause")) ;
                        bPaused = FALSE ;
                   }
                   return TRUE ;
      

  6.   

    case IDC_PLAY_END:
                        // Reset output for close preparation
                   
                   bEnding = TRUE ;
                   waveOutReset (hWaveOut) ;
                   return TRUE ;
                   
              case IDC_PLAY_REV:
                        // Reverse save buffer and play
                   
                   bReverse = TRUE ;
                   ReverseMemory (pSaveBuffer, dwDataLength) ;
                   
                   SendMessage (hwnd, WM_COMMAND, IDC_PLAY_BEG, 0) ;
                   return TRUE ;
                   
              case IDC_PLAY_REP:
                        // Set infinite repetitions and play
                   
                   dwRepetitions = -1 ;
                   SendMessage (hwnd, WM_COMMAND, IDC_PLAY_BEG, 0) ;
                   return TRUE ;
                   
              case IDC_PLAY_SPEED:
                        // Open waveform audio for fast output
                   
                   waveform.wFormatTag      = WAVE_FORMAT_PCM ;
                   waveform.nChannels       = 1 ;
                   waveform.nSamplesPerSec  = 22050 ;
                   waveform.nAvgBytesPerSec = 22050 ;
                   waveform.nBlockAlign     = 1 ;
                   waveform.wBitsPerSample  = 8 ;
                   waveform.cbSize          = 0 ;
                   
                   if (waveOutOpen (&hWaveOut, 0, &waveform, (DWORD) hwnd, 0,
                                               CALLBACK_WINDOW))
                   {
                        MessageBeep (MB_ICONEXCLAMATION) ;
                        MessageBox (hwnd, szOpenError, szAppName,
                                          MB_ICONEXCLAMATION | MB_OK) ;
                   }
                   return TRUE ;
              }
              break ;
      

  7.   

    case MM_WIM_OPEN:
                   // Shrink down the save buffer
              
              pSaveBuffer = realloc (pSaveBuffer, 1) ;
              
                   // Enable and disable Buttons
              
              EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), TRUE)  ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG),   FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END),   FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REV),   FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REP),   FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_SPEED), FALSE) ;
              SetFocus (GetDlgItem (hwnd, IDC_RECORD_END)) ;               // Add the buffers
              
              waveInAddBuffer (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ;
              waveInAddBuffer (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ;
              
                   // Begin sampling
              
              bRecording = TRUE ;
              bEnding = FALSE ;
              dwDataLength = 0 ;
              waveInStart (hWaveIn) ;
              return TRUE ;
              
         case MM_WIM_DATA:
             
                   // Reallocate save buffer memory
              
              pNewBuffer = realloc (pSaveBuffer, dwDataLength +
                                       ((PWAVEHDR) lParam)->dwBytesRecorded) ;
              
              if (pNewBuffer == NULL)
              {
                   waveInClose (hWaveIn) ;
                   MessageBeep (MB_ICONEXCLAMATION) ;
                   MessageBox (hwnd, szMemError, szAppName,
                                     MB_ICONEXCLAMATION | MB_OK) ;
                   return TRUE ;
              }
              
              pSaveBuffer = pNewBuffer ;
              CopyMemory (pSaveBuffer + dwDataLength, ((PWAVEHDR) lParam)->lpData,
                             ((PWAVEHDR) lParam)->dwBytesRecorded) ;
              
              dwDataLength += ((PWAVEHDR) lParam)->dwBytesRecorded ;
              
              if (bEnding)
              {
                   waveInClose (hWaveIn) ;
                   return TRUE ;
              }
              
                   // Send out a new buffer
              
              waveInAddBuffer (hWaveIn, (PWAVEHDR) lParam, sizeof (WAVEHDR)) ;
              return TRUE ;
      

  8.   

    2ndboy(丢丢):
    我还想问一下,就是我想通过WINsocket将内存中的录音资源发到对等方(想实现点对点语音通讯),是不是要将header一起发送? 还是只要发送语音数据就可以啦?语音数据该如何跳过header直接读取?
    谢谢
      

  9.   

    case MM_WIM_CLOSE:
                   // Free the buffer memory          waveInUnprepareHeader (hWaveIn, pWaveHdr1, sizeof (WAVEHDR)) ;
              waveInUnprepareHeader (hWaveIn, pWaveHdr2, sizeof (WAVEHDR)) ;          free (pBuffer1) ;
              free (pBuffer2) ;
              
                   // Enable and disable buttons
              
              EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), TRUE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE) ;
              SetFocus (GetDlgItem (hwnd, IDC_RECORD_BEG)) ;
              
              if (dwDataLength > 0)
              {
                   EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG),   TRUE)  ;
                   EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE) ;
                   EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END),   FALSE) ;
                   EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REP),   TRUE)  ;
                   EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REV),   TRUE)  ;
                   EnableWindow (GetDlgItem (hwnd, IDC_PLAY_SPEED), TRUE)  ;
                   SetFocus (GetDlgItem (hwnd, IDC_PLAY_BEG)) ;
              }
              bRecording = FALSE ;
              
              if (bTerminating)
                   SendMessage (hwnd, WM_SYSCOMMAND, SC_CLOSE, 0L) ;
              
              return TRUE ;
              
         case MM_WOM_OPEN:
                   // Enable and disable buttons
              
              EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG),   FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), TRUE)  ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END),   TRUE)  ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REP),   FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REV),   FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_SPEED), FALSE) ;
              SetFocus (GetDlgItem (hwnd, IDC_PLAY_END)) ;
              
                   // Set up header
              
              pWaveHdr1->lpData          = pSaveBuffer ;
              pWaveHdr1->dwBufferLength  = dwDataLength ;
              pWaveHdr1->dwBytesRecorded = 0 ;
              pWaveHdr1->dwUser          = 0 ;
              pWaveHdr1->dwFlags         = WHDR_BEGINLOOP | WHDR_ENDLOOP ;
              pWaveHdr1->dwLoops         = dwRepetitions ;
              pWaveHdr1->lpNext          = NULL ;
              pWaveHdr1->reserved        = 0 ;
              
                   // Prepare and write
              
              waveOutPrepareHeader (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ;
              waveOutWrite (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ;
              
              bEnding = FALSE ;
              bPlaying = TRUE ;
              return TRUE ;
      

  10.   

    case MM_WOM_DONE:
              waveOutUnprepareHeader (hWaveOut, pWaveHdr1, sizeof (WAVEHDR)) ;
              waveOutClose (hWaveOut) ;
              return TRUE ;
              
         case MM_WOM_CLOSE:
                   // Enable and disable buttons
              
              EnableWindow (GetDlgItem (hwnd, IDC_RECORD_BEG), TRUE)  ;
              EnableWindow (GetDlgItem (hwnd, IDC_RECORD_END), TRUE)  ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_BEG),   TRUE)  ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_PAUSE), FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_END),   FALSE) ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REV),   TRUE)  ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_REP),   TRUE)  ;
              EnableWindow (GetDlgItem (hwnd, IDC_PLAY_SPEED), TRUE)  ;
              SetFocus (GetDlgItem (hwnd, IDC_PLAY_BEG)) ;
              
              SetDlgItemText (hwnd, IDC_PLAY_PAUSE, TEXT ("Pause")) ;
              bPaused = FALSE ;
              dwRepetitions = 1 ;
              bPlaying = FALSE ;
              
              if (bReverse)
              {
                   ReverseMemory (pSaveBuffer, dwDataLength) ;
                   bReverse = FALSE ;
              }
              
              if (bTerminating)
                   SendMessage (hwnd, WM_SYSCOMMAND, SC_CLOSE, 0L) ;
              
              return TRUE ;
              
         case WM_SYSCOMMAND:
              switch (LOWORD (wParam))
              {
              case SC_CLOSE:
                   if (bRecording)
                   {
                        bTerminating = TRUE ;
                        bEnding = TRUE ;
                        waveInReset (hWaveIn) ;
                        return TRUE ;
                   }
                   
                   if (bPlaying)
                   {
                        bTerminating = TRUE ;
                        bEnding = TRUE ;
                        waveOutReset (hWaveOut) ;
                        return TRUE ;
                   }
                   
                   free (pWaveHdr1) ;
                   free (pWaveHdr2) ;
                   free (pSaveBuffer) ;
                   EndDialog (hwnd, 0) ;
                   return TRUE ;
              }
              break ;
         }
         return FALSE ;
    }
      

  11.   

    主程序发完了,下面是资源脚本:
    //Microsoft Developer Studio generated resource script.
    //
    #include "resource.h"#define APSTUDIO_READONLY_SYMBOLS
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 2 resource.
    //
    #include "afxres.h"/////////////////////////////////////////////////////////////////////////////
    #undef APSTUDIO_READONLY_SYMBOLS/////////////////////////////////////////////////////////////////////////////
    // English (U.S.) resources#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
    #ifdef _WIN32
    LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
    #pragma code_page(1252)
    #endif //_WIN32#ifdef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // TEXTINCLUDE
    //1 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "resource.h\0"
    END2 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "#include ""afxres.h""\r\n"
        "\0"
    END3 TEXTINCLUDE DISCARDABLE 
    BEGIN
        "\r\n"
        "\0"
    END#endif    // APSTUDIO_INVOKED
      

  12.   

    /////////////////////////////////////////////////////////////////////////////
    //
    // Dialog
    //RECORD DIALOG DISCARDABLE  100, 100, 152, 74
    STYLE WS_MINIMIZEBOX | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
    CAPTION "Waveform Audio Recorder"
    FONT 8, "MS Sans Serif"
    BEGIN
        PUSHBUTTON      "Record",IDC_RECORD_BEG,28,8,40,14
        PUSHBUTTON      "End",IDC_RECORD_END,76,8,40,14,WS_DISABLED
        PUSHBUTTON      "Play",IDC_PLAY_BEG,8,30,40,14,WS_DISABLED
        PUSHBUTTON      "Pause",IDC_PLAY_PAUSE,56,30,40,14,WS_DISABLED
        PUSHBUTTON      "End",IDC_PLAY_END,104,30,40,14,WS_DISABLED
        PUSHBUTTON      "Reverse",IDC_PLAY_REV,8,52,40,14,WS_DISABLED
        PUSHBUTTON      "Repeat",IDC_PLAY_REP,56,52,40,14,WS_DISABLED
        PUSHBUTTON      "Speedup",IDC_PLAY_SPEED,104,52,40,14,WS_DISABLED
    END
    /////////////////////////////////////////////////////////////////////////////
    //
    // DESIGNINFO
    //#ifdef APSTUDIO_INVOKED
    GUIDELINES DESIGNINFO DISCARDABLE 
    BEGIN
        "RECORD", DIALOG
        BEGIN
            LEFTMARGIN, 7
            RIGHTMARGIN, 145
            TOPMARGIN, 7
            BOTTOMMARGIN, 67
        END
    END
    #endif    // APSTUDIO_INVOKED#endif    // English (U.S.) resources
    /////////////////////////////////////////////////////////////////////////////#ifndef APSTUDIO_INVOKED
    /////////////////////////////////////////////////////////////////////////////
    //
    // Generated from the TEXTINCLUDE 3 resource.
    //
    /////////////////////////////////////////////////////////////////////////////
    #endif    // not APSTUDIO_INVOKED
      

  13.   

    资源脚本发完了,下面是resouce.h:
    //{{NO_DEPENDENCIES}}
    // Microsoft Developer Studio generated include file.
    // Used by Record.rc
    //
    #define IDC_RECORD_BEG                  1000
    #define IDC_RECORD_END                  1001
    #define IDC_PLAY_BEG                    1002
    #define IDC_PLAY_PAUSE                  1003
    #define IDC_PLAY_END                    1004
    #define IDC_PLAY_REV                    1005
    #define IDC_PLAY_REP                    1006
    #define IDC_PLAY_SPEED                  1007// Next default values for new objects
    // 
    #ifdef APSTUDIO_INVOKED
    #ifndef APSTUDIO_READONLY_SYMBOLS
    #define _APS_NEXT_RESOURCE_VALUE        102
    #define _APS_NEXT_COMMAND_VALUE         40001
    #define _APS_NEXT_CONTROL_VALUE         1008
    #define _APS_NEXT_SYMED_VALUE           101
    #endif
    #endif
      

  14.   

    谢谢啦,
    我还想问一下,你有对网络语音传送的code么?:-)
      

  15.   

    用waveIn...采集到的声音数据是纯数据,没有头,所以没有必要传送头部。
    当然要把采集时的参数传送给对方,要不放出来就不对了。
    也可以把参数定死,这样就不必传送参数了。我没作过传送语音,只作过传送字符的,但原理是一样的。还有就是上面那个程序是基于对话框的。
      

  16.   

    http://www.csdn.net/expert/topic/639/639516.xml?temp=.2486994
      

  17.   

    好的代码我拿回去研究一下!
    如果你有工程请把上面的工程发到我的信箱里面。:)
    email:[email protected]
    给分啦