Chris@4
|
1 #include "portaudiocpp/HostApi.hxx"
|
Chris@4
|
2
|
Chris@4
|
3 #include "portaudiocpp/System.hxx"
|
Chris@4
|
4 #include "portaudiocpp/Device.hxx"
|
Chris@4
|
5 #include "portaudiocpp/SystemDeviceIterator.hxx"
|
Chris@4
|
6 #include "portaudiocpp/Exception.hxx"
|
Chris@4
|
7
|
Chris@4
|
8 namespace portaudio
|
Chris@4
|
9 {
|
Chris@4
|
10
|
Chris@4
|
11 // -----------------------------------------------------------------------------------
|
Chris@4
|
12
|
Chris@4
|
13 HostApi::HostApi(PaHostApiIndex index) : devices_(NULL)
|
Chris@4
|
14 {
|
Chris@4
|
15 try
|
Chris@4
|
16 {
|
Chris@4
|
17 info_ = Pa_GetHostApiInfo(index);
|
Chris@4
|
18
|
Chris@4
|
19 // Create and populate devices array:
|
Chris@4
|
20 int numDevices = deviceCount();
|
Chris@4
|
21
|
Chris@4
|
22 devices_ = new Device*[numDevices];
|
Chris@4
|
23
|
Chris@4
|
24 for (int i = 0; i < numDevices; ++i)
|
Chris@4
|
25 {
|
Chris@4
|
26 PaDeviceIndex deviceIndex = Pa_HostApiDeviceIndexToDeviceIndex(index, i);
|
Chris@4
|
27
|
Chris@4
|
28 if (deviceIndex < 0)
|
Chris@4
|
29 {
|
Chris@4
|
30 throw PaException(deviceIndex);
|
Chris@4
|
31 }
|
Chris@4
|
32
|
Chris@4
|
33 devices_[i] = &System::instance().deviceByIndex(deviceIndex);
|
Chris@4
|
34 }
|
Chris@4
|
35 }
|
Chris@4
|
36 catch (const std::exception &e)
|
Chris@4
|
37 {
|
Chris@4
|
38 // Delete any (partially) constructed objects (deconstructor isn't called):
|
Chris@4
|
39 delete[] devices_; // devices_ is either NULL or valid
|
Chris@4
|
40
|
Chris@4
|
41 // Re-throw exception:
|
Chris@4
|
42 throw e;
|
Chris@4
|
43 }
|
Chris@4
|
44 }
|
Chris@4
|
45
|
Chris@4
|
46 HostApi::~HostApi()
|
Chris@4
|
47 {
|
Chris@4
|
48 // Destroy devices array:
|
Chris@4
|
49 delete[] devices_;
|
Chris@4
|
50 }
|
Chris@4
|
51
|
Chris@4
|
52 // -----------------------------------------------------------------------------------
|
Chris@4
|
53
|
Chris@4
|
54 PaHostApiTypeId HostApi::typeId() const
|
Chris@4
|
55 {
|
Chris@4
|
56 return info_->type;
|
Chris@4
|
57 }
|
Chris@4
|
58
|
Chris@4
|
59 PaHostApiIndex HostApi::index() const
|
Chris@4
|
60 {
|
Chris@4
|
61 PaHostApiIndex index = Pa_HostApiTypeIdToHostApiIndex(typeId());
|
Chris@4
|
62
|
Chris@4
|
63 if (index < 0)
|
Chris@4
|
64 throw PaException(index);
|
Chris@4
|
65
|
Chris@4
|
66 return index;
|
Chris@4
|
67 }
|
Chris@4
|
68
|
Chris@4
|
69 const char *HostApi::name() const
|
Chris@4
|
70 {
|
Chris@4
|
71 return info_->name;
|
Chris@4
|
72 }
|
Chris@4
|
73
|
Chris@4
|
74 int HostApi::deviceCount() const
|
Chris@4
|
75 {
|
Chris@4
|
76 return info_->deviceCount;
|
Chris@4
|
77 }
|
Chris@4
|
78
|
Chris@4
|
79 // -----------------------------------------------------------------------------------
|
Chris@4
|
80
|
Chris@4
|
81 HostApi::DeviceIterator HostApi::devicesBegin()
|
Chris@4
|
82 {
|
Chris@4
|
83 DeviceIterator tmp;
|
Chris@4
|
84 tmp.ptr_ = &devices_[0]; // begin (first element)
|
Chris@4
|
85 return tmp;
|
Chris@4
|
86 }
|
Chris@4
|
87
|
Chris@4
|
88 HostApi::DeviceIterator HostApi::devicesEnd()
|
Chris@4
|
89 {
|
Chris@4
|
90 DeviceIterator tmp;
|
Chris@4
|
91 tmp.ptr_ = &devices_[deviceCount()]; // end (one past last element)
|
Chris@4
|
92 return tmp;
|
Chris@4
|
93 }
|
Chris@4
|
94
|
Chris@4
|
95 // -----------------------------------------------------------------------------------
|
Chris@4
|
96
|
Chris@4
|
97 Device &HostApi::defaultInputDevice() const
|
Chris@4
|
98 {
|
Chris@4
|
99 return System::instance().deviceByIndex(info_->defaultInputDevice);
|
Chris@4
|
100 }
|
Chris@4
|
101
|
Chris@4
|
102 Device &HostApi::defaultOutputDevice() const
|
Chris@4
|
103 {
|
Chris@4
|
104 return System::instance().deviceByIndex(info_->defaultOutputDevice);
|
Chris@4
|
105 }
|
Chris@4
|
106
|
Chris@4
|
107 // -----------------------------------------------------------------------------------
|
Chris@4
|
108
|
Chris@4
|
109 bool HostApi::operator==(const HostApi &rhs) const
|
Chris@4
|
110 {
|
Chris@4
|
111 return (typeId() == rhs.typeId());
|
Chris@4
|
112 }
|
Chris@4
|
113
|
Chris@4
|
114 bool HostApi::operator!=(const HostApi &rhs) const
|
Chris@4
|
115 {
|
Chris@4
|
116 return !(*this == rhs);
|
Chris@4
|
117 }
|
Chris@4
|
118
|
Chris@4
|
119 // -----------------------------------------------------------------------------------
|
Chris@4
|
120
|
Chris@4
|
121 } // namespace portaudio
|