forked from dolphin-emu/dolphin
		
	
		
			
	
	
		
			47 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
		
		
			
		
	
	
			47 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| 
								 | 
							
								// Copyright 2017 Dolphin Emulator Project
							 | 
						||
| 
								 | 
							
								// Licensed under GPLv2+
							 | 
						||
| 
								 | 
							
								// Refer to the license.txt file included.
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include <libusb.h>
							 | 
						||
| 
								 | 
							
								#include <memory>
							 | 
						||
| 
								 | 
							
								#include <mutex>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								#include "Common/LibusbContext.h"
							 | 
						||
| 
								 | 
							
								#include "Common/MsgHandler.h"
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace LibusbContext
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								static std::shared_ptr<libusb_context> s_libusb_context;
							 | 
						||
| 
								 | 
							
								static std::once_flag s_context_initialized;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								static libusb_context* Create()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  libusb_context* context;
							 | 
						||
| 
								 | 
							
								  const int ret = libusb_init(&context);
							 | 
						||
| 
								 | 
							
								  if (ret < LIBUSB_SUCCESS)
							 | 
						||
| 
								 | 
							
								  {
							 | 
						||
| 
								 | 
							
								    bool is_windows = false;
							 | 
						||
| 
								 | 
							
								#ifdef _WIN32
							 | 
						||
| 
								 | 
							
								    is_windows = true;
							 | 
						||
| 
								 | 
							
								#endif
							 | 
						||
| 
								 | 
							
								    if (is_windows && ret == LIBUSB_ERROR_NOT_FOUND)
							 | 
						||
| 
								 | 
							
								      PanicAlertT("Failed to initialize libusb because usbdk is not installed.");
							 | 
						||
| 
								 | 
							
								    else
							 | 
						||
| 
								 | 
							
								      PanicAlertT("Failed to initialize libusb: %s", libusb_error_name(ret));
							 | 
						||
| 
								 | 
							
								    return nullptr;
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								  return context;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								std::shared_ptr<libusb_context> Get()
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								  std::call_once(s_context_initialized, []() {
							 | 
						||
| 
								 | 
							
								    s_libusb_context.reset(Create(), [](auto* context) {
							 | 
						||
| 
								 | 
							
								      if (context != nullptr)
							 | 
						||
| 
								 | 
							
								        libusb_exit(context);
							 | 
						||
| 
								 | 
							
								    });
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								  return s_libusb_context;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								}
							 |