コード例 #1
0
ファイル: device.cpp プロジェクト: jmullins/efficacy
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;
}
コード例 #2
0
ファイル: openmpt123_portaudio.hpp プロジェクト: kode54/Cog
	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;
		}
	}