OSDN Git Service

5a84f53e981c7bae5dea38af2379d92c49f3a901
[winaudioj/stedx.git] / 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 #include "sf_memory.h"
19
20 using namespace boost;
21
22 namespace sf
23 {
24 //typedef CComPtr<IAudioClient> IAudioClientPtr;
25 std::map<HRESULT,std::wstring> com_error_  = boost::assign::list_of<std::pair<HRESULT,std::wstring> >
26     (E_POINTER,L"E_POINTER")
27     (E_INVALIDARG,L"E_INVALIDARG")
28         (AUDCLNT_E_NOT_INITIALIZED,L"AUDCLNT_E_NOT_INITIALIZED")
29         (AUDCLNT_E_ALREADY_INITIALIZED,L"AUDCLNT_E_ALREADY_INITIALIZED")
30     (AUDCLNT_E_WRONG_ENDPOINT_TYPE,L"AUDCLNT_E_WRONG_ENDPOINT_TYPE")
31         (AUDCLNT_E_DEVICE_INVALIDATED,L"AUDCLNT_E_DEVICE_INVALIDATED")
32         (AUDCLNT_E_NOT_STOPPED,L"AUDCLNT_E_NOT_STOPPED")
33         (AUDCLNT_E_BUFFER_TOO_LARGE,L"AUDCLNT_E_BUFFER_TOO_LARGE")
34         (AUDCLNT_E_OUT_OF_ORDER,L"AUDCLNT_E_OUT_OF_ORDER")
35         (AUDCLNT_E_UNSUPPORTED_FORMAT,L"AUDCLNT_E_UNSUPPORTED_FORMAT")
36         (AUDCLNT_E_INVALID_SIZE,L"AUDCLNT_E_INVALID_SIZE")
37         (AUDCLNT_E_DEVICE_IN_USE,L"AUDCLNT_E_DEVICE_IN_USE")
38         (AUDCLNT_E_BUFFER_OPERATION_PENDING,L"AUDCLNT_E_BUFFER_OPERATION_PENDING")
39         (AUDCLNT_E_THREAD_NOT_REGISTERED,L"AUDCLNT_E_THREAD_NOT_REGISTERED")
40         (AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED,L"AUDCLNT_E_EXCLUSIVE_MODE_NOT_ALLOWED")
41         (AUDCLNT_E_ENDPOINT_CREATE_FAILED,L"AUDCLNT_E_ENDPOINT_CREATE_FAILED")
42         (AUDCLNT_E_SERVICE_NOT_RUNNING,L"AUDCLNT_E_SERVICE_NOT_RUNNING")
43         (AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED,L"AUDCLNT_E_EVENTHANDLE_NOT_EXPECTED")
44         (AUDCLNT_E_EXCLUSIVE_MODE_ONLY,L"AUDCLNT_E_EXCLUSIVE_MODE_ONLY")
45         (AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL,L"AUDCLNT_E_BUFDURATION_PERIOD_NOT_EQUAL")
46         (AUDCLNT_E_EVENTHANDLE_NOT_SET,L"AUDCLNT_E_EVENTHANDLE_NOT_SET")
47         (AUDCLNT_E_INCORRECT_BUFFER_SIZE,L"AUDCLNT_E_INCORRECT_BUFFER_SIZE")
48         (AUDCLNT_E_BUFFER_SIZE_ERROR,L"AUDCLNT_E_BUFFER_SIZE_ERROR")
49         (AUDCLNT_S_BUFFER_EMPTY,L"AUDCLNT_S_BUFFER_EMPTY")
50         (AUDCLNT_S_THREAD_ALREADY_REGISTERED,L"AUDCLNT_S_THREAD_ALREADY_REGISTERED");
51         
52
53 win32_error_exception::win32_error_exception(boost::uint32_t hr)
54 : std::exception("HRESULT ERROR"),hresult_(hr)
55 {
56         local_memory<wchar_t> mem;
57         DWORD result = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,hr,0,(LPWSTR)&mem,0,0);
58         if(result != 0){
59                 error_ = mem.get();
60         } else {
61                 std::map<HRESULT,std::wstring>::iterator it = com_error_.find(hr);
62                 if(it != com_error_.end())
63                 {
64                         error_ = it->second;
65                 } else {
66                         error_ = (boost::wformat(L"0x%x 不明なCOMエラー") % hr).str();
67                 }
68
69         }
70 };
71
72 win32_error_exception::win32_error_exception()
73 {
74         hresult_ = ::GetLastError();
75         local_memory<wchar_t> mem;
76         DWORD rv =  FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM,0,hresult_,0,(LPWSTR)&mem,0,0);
77         error_ = mem.get();
78         //Logger::outputDebugPrintf(L"Win32 Error %x %s",hresult_,mem.Get() );
79 };
80
81 }