OSDN Git Service

WASAPIの排他モード・共有モードを切り替えられるようにした。
[winaudioj/async.git] / async / exception.cpp
1 #include "stdafx.h"
2 #include "exception.h"
3 #include <objbase.h>
4 #include <wtypes.h>
5 #include <winerror.h>
6 #include <avrt.h>
7 #include <strsafe.h>
8 #include <audioclient.h>
9 #include <audiopolicy.h>
10
11
12
13 #define BOOST_ASSIGN_MAX_PARAMS 7
14 #include <boost/assign.hpp>
15 #include <boost/assign/ptr_list_of.hpp>
16 #include <boost/assign/ptr_list_inserter.hpp>
17 #include <boost/foreach.hpp>
18
19 #if _DEBUG
20 #define _CRTDBG_MAP_ALLOC
21 #include <crtdbg.h>
22 #define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
23 #endif
24
25 #include "sf_memory.h"
26
27 using namespace boost;
28
29 namespace sf
30 {
31 //typedef CComPtr<IAudioClient> IAudioClientPtr;
32 std::map<HRESULT,std::wstring> com_error_  = boost::assign::list_of<std::pair<HRESULT,std::wstring> >
33     (E_POINTER,L"E_POINTER")
34     (E_INVALIDARG,L"E_INVALIDARG")
35     (DWRITE_E_FILEFORMAT,L"DWRITE_E_FILEFORMAT")
36     (DWRITE_E_UNEXPECTED,L"DWRITE_E_UNEXPECTED")
37     (DWRITE_E_NOFONT,L"DWRITE_E_NOFONT")
38     (DWRITE_E_FILENOTFOUND,L"DWRITE_E_FILENOTFOUND")
39     (DWRITE_E_FILEACCESS,L"DWRITE_E_FILEACCESS")
40     (DWRITE_E_FONTCOLLECTIONOBSOLETE,L"DWRITE_E_FONTCOLLECTIONOBSOLETE")
41     (DWRITE_E_ALREADYREGISTERED,L"DWRITE_E_ALREADYREGISTERED")
42         (AUDCLNT_E_NOT_INITIALIZED,L"AUDCLNT_E_NOT_INITIALIZED")
43         (AUDCLNT_E_ALREADY_INITIALIZED,L"AUDCLNT_E_ALREADY_INITIALIZED")
44     (AUDCLNT_E_WRONG_ENDPOINT_TYPE,L"AUDCLNT_E_WRONG_ENDPOINT_TYPE")
45         (AUDCLNT_E_DEVICE_INVALIDATED,L"AUDCLNT_E_DEVICE_INVALIDATED")
46         (AUDCLNT_E_NOT_STOPPED,L"AUDCLNT_E_NOT_STOPPED")
47         (AUDCLNT_E_BUFFER_TOO_LARGE,L"AUDCLNT_E_BUFFER_TOO_LARGE")
48         (AUDCLNT_E_OUT_OF_ORDER,L"AUDCLNT_E_OUT_OF_ORDER")
49         (AUDCLNT_E_UNSUPPORTED_FORMAT,L"AUDCLNT_E_UNSUPPORTED_FORMAT")
50         (AUDCLNT_E_INVALID_SIZE,L"AUDCLNT_E_INVALID_SIZE")
51         (AUDCLNT_E_DEVICE_IN_USE,L"AUDCLNT_E_DEVICE_IN_USE")
52         (AUDCLNT_E_BUFFER_OPERATION_PENDING,L"AUDCLNT_E_BUFFER_OPERATION_PENDING")
53         (AUDCLNT_E_THREAD_NOT_REGISTERED,L"AUDCLNT_E_THREAD_NOT_REGISTERED")
54         (AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED,L"AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED")
55         (AUDCLNT_E_ENDPOINT_CREATE_FAILED,L"AUDCLNT_E_ENDPOINT_CREATE_FAILED")
56         (AUDCLNT_E_SERVICE_NOT_RUNNING,L"AUDCLNT_E_SERVICE_NOT_RUNNING")
57         (AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED,L"AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED")
58         (AUDCLNT_E_EXCLUSIVE_MODE_ONLY,L"AUDCLNT_E_EXCLUSIVE_MODE_ONLY")
59         (AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL,L"AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL")
60         (AUDCLNT_E_EVENTHANDLE_NOT_SET,L"AUDCLNT_E_EVENTHANDLE_NOT_SET")
61         (AUDCLNT_E_INCORRECT_BUFFER_SIZE,L"AUDCLNT_E_INCORRECT_BUFFER_SIZE")
62         (AUDCLNT_E_BUFFER_SIZE_ERROR,L"AUDCLNT_E_BUFFER_SIZE_ERROR")
63         (AUDCLNT_S_BUFFER_EMPTY,L"AUDCLNT_S_BUFFER_EMPTY")
64         (AUDCLNT_S_THREAD_ALREADY_REGISTERED,L"AUDCLNT_S_THREAD_ALREADY_REGISTERED")
65   (DXGI_ERROR_UNSUPPORTED,L"DXGI_ERROR_UNSUPPORTED ")
66   (DXGI_STATUS_OCCLUDED,L"DXGI_STATUS_OCCLUDED")
67   (DXGI_STATUS_CLIPPED,L"DXGI_STATUS_CLIPPED")
68   ;
69         
70
71 win32_error_exception::win32_error_exception(uint32_t hr)
72 : std::exception("HRESULT ERROR"),hresult_(hr)
73 {
74         local_memory<wchar_t> mem;
75         DWORD 結果 = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,hr,0,(LPWSTR)&mem,0,0);
76         if(結果 != 0){
77                 error_ = mem.get();
78         } else {
79                 std::map<HRESULT,std::wstring>::iterator it = com_error_.find(hr);
80                 if(it != com_error_.end())
81                 {
82                         error_ = it->second;
83                 } else {
84                         error_ = (boost::wformat(L"0x%x 不明なCOMエラー") % hr).str();
85                 }
86
87         }
88 };
89
90 win32_error_exception::win32_error_exception()
91 {
92         hresult_ = ::GetLastError();
93         local_memory<wchar_t> mem;
94         DWORD rv =  FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,hresult_,0,(LPWSTR)&mem,0,0);
95         error_ = mem.get();
96         //Logger::outputDebugPrintf(L"Win32 Error %x %s",hresult_,mem.Get() );
97 };
98
99 std::wstring& win32_error_exception::get_last_error_str(uint32_t err)
100 {
101 //      DWORD err = ::GetLastError();
102   std::wstring err_str;
103         local_memory<wchar_t> mem;
104         DWORD rv =  FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,err,0,(LPWSTR)&mem,0,0);
105         err_str = mem.get();
106   return err_str;
107 }
108
109 }