BOOL CDevice::QueryLogicalVolumes() { HANDLE hDevice = CreateFile(m_devicePath.c_str(), // device interface name GENERIC_READ | GENERIC_WRITE, // dwDesiredAccess FILE_SHARE_READ | FILE_SHARE_WRITE, // dwShareMode NULL, // lpSecurityAttributes OPEN_EXISTING, // dwCreationDistribution 0, // dwFlagsAndAttributes NULL // hTemplateFile ); if (hDevice == INVALID_HANDLE_VALUE) return 0; STORAGE_DEVICE_NUMBER sdn; DWORD bytesReturned; BOOL status=DeviceIoControl(hDevice,IOCTL_STORAGE_GET_DEVICE_NUMBER, &sdn,sizeof(STORAGE_DEVICE_NUMBER), &sdn,sizeof(STORAGE_DEVICE_NUMBER), &bytesReturned, FALSE); CloseHandle(hDevice); if(status==0) return 0; char logical_drives[512]; GetLogicalDriveStrings(sizeof(logical_drives),logical_drives); m_logicalVolumes.erase(); int index=0; std::string device_string("\\\\.\\_:"); for(int i=0;i<512;i++) { if(i!=0 && logical_drives[i]==0 && logical_drives[i-1]==0) break; if(logical_drives[i]==0) { device_string[4]=logical_drives[index]; HANDLE hVolume=CreateFile(device_string.c_str(), GENERIC_READ | GENERIC_WRITE, // dwDesiredAccess FILE_SHARE_READ | FILE_SHARE_WRITE, // dwShareMode NULL, // lpSecurityAttributes OPEN_EXISTING, // dwCreationDistribution 0, // dwFlagsAndAttributes NULL // hTemplateFile ); if(hVolume==INVALID_HANDLE_VALUE) continue; STORAGE_DEVICE_NUMBER sdn_vol; DWORD bytesReturned; BOOL status=DeviceIoControl(hVolume,IOCTL_STORAGE_GET_DEVICE_NUMBER, &sdn_vol,sizeof(STORAGE_DEVICE_NUMBER), &sdn_vol,sizeof(STORAGE_DEVICE_NUMBER), &bytesReturned, FALSE); CloseHandle(hVolume); if(status==0) continue; if(sdn.DeviceNumber==sdn_vol.DeviceNumber && sdn.DeviceType==sdn_vol.DeviceType) { if(index!=0) m_logicalVolumes+=","; m_logicalVolumes+=&logical_drives[index]; } if(logical_drives[i+1]==0) break; index=i+1; } } return 1; }
portaudio_stream_blocking_raii( commandlineflags & flags, std::ostream & log ) : portaudio_raii(flags.verbose, log) , stream(NULL) , interleaved(false) , channels(flags.channels) { PaStreamParameters streamparameters; std::memset( &streamparameters, 0, sizeof(PaStreamParameters) ); std::istringstream device_string( flags.device ); int device = -1; device_string >> device; streamparameters.device = ( device == -1 ) ? Pa_GetDefaultOutputDevice() : device; streamparameters.channelCount = flags.channels; streamparameters.sampleFormat = ( flags.use_float ? paFloat32 : paInt16 ) | paNonInterleaved; if ( flags.buffer == default_high ) { streamparameters.suggestedLatency = Pa_GetDeviceInfo( streamparameters.device )->defaultHighOutputLatency; flags.buffer = static_cast<std::int32_t>( Pa_GetDeviceInfo( streamparameters.device )->defaultHighOutputLatency * 1000.0 ); } else if ( flags.buffer == default_low ) { streamparameters.suggestedLatency = Pa_GetDeviceInfo( streamparameters.device )->defaultLowOutputLatency; flags.buffer = static_cast<std::int32_t>( Pa_GetDeviceInfo( streamparameters.device )->defaultLowOutputLatency * 1000.0 ); } else { streamparameters.suggestedLatency = flags.buffer * 0.001; } unsigned long framesperbuffer = 0; if ( flags.mode != ModeUI ) { framesperbuffer = paFramesPerBufferUnspecified; flags.period = 50; flags.period = std::min<std::int32_t>( flags.period, flags.buffer / 3 ); } else if ( flags.period == default_high ) { framesperbuffer = paFramesPerBufferUnspecified; flags.period = 50; flags.period = std::min<std::int32_t>( flags.period, flags.buffer / 3 ); } else if ( flags.period == default_low ) { framesperbuffer = paFramesPerBufferUnspecified; flags.period = 10; flags.period = std::min<std::int32_t>( flags.period, flags.buffer / 3 ); } else { framesperbuffer = flags.period * flags.samplerate / 1000; } if ( flags.period <= 0 ) { flags.period = 1; } flags.apply_default_buffer_sizes(); if ( flags.verbose ) { log << "PortAudio:" << std::endl; log << " device: " << streamparameters.device << " [ " << Pa_GetHostApiInfo( Pa_GetDeviceInfo( streamparameters.device )->hostApi )->name << " / " << Pa_GetDeviceInfo( streamparameters.device )->name << " ] " << std::endl; log << " low latency: " << Pa_GetDeviceInfo( streamparameters.device )->defaultLowOutputLatency << std::endl; log << " high latency: " << Pa_GetDeviceInfo( streamparameters.device )->defaultHighOutputLatency << std::endl; log << " suggested latency: " << streamparameters.suggestedLatency << std::endl; log << " frames per buffer: " << framesperbuffer << std::endl; log << " ui redraw: " << flags.period << std::endl; } PaError e = PaError(); e = Pa_OpenStream( &stream, NULL, &streamparameters, flags.samplerate, framesperbuffer, ( flags.dither > 0 ) ? paNoFlag : paDitherOff, NULL, NULL ); if ( e != paNoError ) { // Non-interleaved failed, try interleaved next. // This might help broken portaudio on MacOS X. streamparameters.sampleFormat &= ~paNonInterleaved; e = Pa_OpenStream( &stream, NULL, &streamparameters, flags.samplerate, framesperbuffer, ( flags.dither > 0 ) ? paNoFlag : paDitherOff, NULL, NULL ); if ( e == paNoError ) { interleaved = true; } check_portaudio_error( e ); } check_portaudio_error( Pa_StartStream( stream ) ); if ( flags.verbose ) { log << " channels: " << streamparameters.channelCount << std::endl; log << " sampleformat: " << ( ( ( streamparameters.sampleFormat & ~paNonInterleaved ) == paFloat32 ) ? "paFloat32" : "paInt16" ) << std::endl; log << " latency: " << Pa_GetStreamInfo( stream )->outputLatency << std::endl; log << " samplerate: " << Pa_GetStreamInfo( stream )->sampleRate << std::endl; log << std::endl; } }