WinApi PCM sound
Recording with a Waveform-Audio Device
The following example opens a waveform-audio device with a new file, records for the specified time, plays the recording, and prompts the user to save the recording if desired. It uses the mciSendCommand function.
// Uses the MCI_OPEN, MCI_RECORD, and MCI_SAVE commands to record and // save a waveform-audio file. Returns 0L if successful; otherwise, // it returns an MCI error code. DWORD recordWAVEFile(DWORD dwMilliSeconds) { UINT wDeviceID; DWORD dwReturn; MCI_OPEN_PARMS mciOpenParms; MCI_RECORD_PARMS mciRecordParms; MCI_SAVE_PARMS mciSaveParms; MCI_PLAY_PARMS mciPlayParms; // Open a waveform-audio device with a new file for recording. mciOpenParms.lpstrDeviceType = "waveaudio"; mciOpenParms.lpstrElementName = ""; if (dwReturn = mciSendCommand(0, MCI_OPEN, MCI_OPEN_ELEMENT | MCI_OPEN_TYPE, (DWORD)(LPVOID) &mciOpenParms)) { // Failed to open device; don't close it, just return error. return (dwReturn); } // The device opened successfully; get the device ID. wDeviceID = mciOpenParms.wDeviceID; // Begin recording and record for the specified number of // milliseconds. Wait for recording to complete before continuing. // Assume the default time format for the waveform-audio device // (milliseconds). mciRecordParms.dwTo = dwMilliSeconds; if (dwReturn = mciSendCommand(wDeviceID, MCI_RECORD, MCI_TO | MCI_WAIT, (DWORD)(LPVOID) &mciRecordParms)) { mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); return (dwReturn); } // Play the recording and query user to save the file. mciPlayParms.dwFrom = 0L; if (dwReturn = mciSendCommand(wDeviceID, MCI_PLAY, MCI_FROM | MCI_WAIT, (DWORD)(LPVOID) &mciPlayParms)) { mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); return (dwReturn); } if (MessageBox(hMainWnd, "Do you want to save this recording?", "", MB_YESNO) == IDNO) { mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); return (0L); } // Save the recording to a file named TEMPFILE.WAV. Wait for // the operation to complete before continuing. mciSaveParms.lpfilename = "tempfile.wav"; if (dwReturn = mciSendCommand(wDeviceID, MCI_SAVE, MCI_SAVE_FILE | MCI_WAIT, (DWORD)(LPVOID) &mciSaveParms)) { mciSendCommand(wDeviceID, MCI_CLOSE, 0, NULL); return (dwReturn); } return (0L); }