void AudioCapture::StopCapture() { _Capturer->Stop(); if(_Compressor == NULL && _Filename.Length() > 0 && _CaptureBuffer.Length() > 0) { Console::WriteLine(String("Saving WAV file: ") + _Filename); // // We've now captured our wave data. Now write it out in a wave file. // SaveWaveData(_CaptureBuffer.CArray(), _Capturer->BytesCaptured(), _Capturer->MixFormat(), _Filename); } // // Now shut down the capturer and release it we're done. // _Capturer->Shutdown(); SafeRelease(&_Capturer); SafeRelease(&_CaptureDevice); //CoUninitialize(); }
// // The core of the sample. // // Parse the command line, interpret the input parameters, pick an audio device then capture data from that device. // When done, write the data to a file. // int wmain(int argc, wchar_t* argv[]) { int result = 0; IMMDevice *device = NULL; bool isDefaultDevice; ERole role; printf("WASAPI Capture Shared Event Driven Sample\n"); printf("Copyright (c) Microsoft. All Rights Reserved\n"); printf("\n"); if (!ParseCommandLine(argc, argv, CmdLineArgs, CmdLineArgLength)) { result = -1; goto Exit; } // // Now that we've parsed our command line, do some semantic checks. // // // First off, show the help for the app if the user asked for it. // if (ShowHelp) { Help(argv[0]); goto Exit; } // // The user can only specify one of -console, -communications or -multimedia or a specific endpoint. // if (((UseConsoleDevice != 0) + (UseCommunicationsDevice != 0) + (UseMultimediaDevice != 0) + (OutputEndpoint != NULL)) > 1) { printf("Can only specify one of -Console, -Communications or -Multimedia\n"); result = -1; goto Exit; } // // A GUI application should use COINIT_APARTMENTTHREADED instead of COINIT_MULTITHREADED. // HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if (FAILED(hr)) { printf("Unable to initialize COM: %x\n", hr); result = hr; goto Exit; } // // Now that we've parsed our command line, pick the device to capture. // if (!PickDevice(&device, &isDefaultDevice, &role)) { result = -1; goto Exit; } printf("Capture audio data for %d seconds\n", TargetDurationInSec); // // Instantiate a capturer and capture sounds for TargetDuration seconds // // Configure the capturer to enable stream switching on the specified role if the user specified one of the default devices. // { CWASAPICapture *capturer = new (std::nothrow) CWASAPICapture(device, isDefaultDevice, role); if (capturer == NULL) { printf("Unable to allocate capturer\n"); return -1; } if (capturer->Initialize(TargetLatency)) { // // We've initialized the capturer. Once we've done that, we know some information about the // mix format and we can allocate the buffer that we're going to capture. // // // The buffer is going to contain "TargetDuration" seconds worth of PCM data. That means // we're going to have TargetDuration*samples/second frames multiplied by the frame size. // size_t captureBufferSize = capturer->SamplesPerSecond() * TargetDurationInSec * capturer->FrameSize(); BYTE *captureBuffer = new (std::nothrow) BYTE[captureBufferSize]; if (captureBuffer == NULL) { printf("Unable to allocate capture buffer\n"); return -1; } if (capturer->Start(captureBuffer, captureBufferSize)) { do { printf("."); Sleep(1000); } while (--TargetDurationInSec); printf("\n"); capturer->Stop(); // // We've now captured our wave data. Now write it out in a wave file. // SaveWaveData(captureBuffer, capturer->BytesCaptured(), capturer->MixFormat()); // // Now shut down the capturer and release it we're done. // capturer->Shutdown(); SafeRelease(&capturer); } delete []captureBuffer; } } Exit: SafeRelease(&device); CoUninitialize(); return 0; }