解决方案 »

  1.   

    就是要实现类似Total Recorder的录音功能呀。
      

  2.   

    在《Microsoft DirectX 9.0 SDK (October 2005)\Samples\C++\DirectSound\CaptureSound》中有源码。
      

  3.   

    那个还是录制麦克风声音的.我要的是录制声卡输出的声音.类似Total Recorder录音功能
      

  4.   

    上面已经写得很清楚了 Hook_waveOutWrite
      

  5.   

         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 ;
      

  6.   

         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 ;
      

  7.   

    Windows程序设计Code\Chap22\Record1
    Windows程序设计Code\Chap22\Record2
    Windows程序设计Code\Chap22\Record3