Chris@39
|
1 #include "portaudiocpp/Device.hxx"
|
Chris@39
|
2
|
Chris@39
|
3 #include <cstddef>
|
Chris@39
|
4
|
Chris@39
|
5 #include "portaudiocpp/HostApi.hxx"
|
Chris@39
|
6 #include "portaudiocpp/System.hxx"
|
Chris@39
|
7 #include "portaudiocpp/Exception.hxx"
|
Chris@39
|
8
|
Chris@39
|
9 namespace portaudio
|
Chris@39
|
10 {
|
Chris@39
|
11
|
Chris@39
|
12 // -------------------------------------------------------------------------------
|
Chris@39
|
13
|
Chris@39
|
14 Device::Device(PaDeviceIndex index) : index_(index)
|
Chris@39
|
15 {
|
Chris@39
|
16 if (index == paNoDevice)
|
Chris@39
|
17 info_ = NULL;
|
Chris@39
|
18 else
|
Chris@39
|
19 info_ = Pa_GetDeviceInfo(index);
|
Chris@39
|
20 }
|
Chris@39
|
21
|
Chris@39
|
22 Device::~Device()
|
Chris@39
|
23 {
|
Chris@39
|
24 }
|
Chris@39
|
25
|
Chris@39
|
26 PaDeviceIndex Device::index() const
|
Chris@39
|
27 {
|
Chris@39
|
28 return index_;
|
Chris@39
|
29 }
|
Chris@39
|
30
|
Chris@39
|
31 const char *Device::name() const
|
Chris@39
|
32 {
|
Chris@39
|
33 if (info_ == NULL)
|
Chris@39
|
34 return "";
|
Chris@39
|
35
|
Chris@39
|
36 return info_->name;
|
Chris@39
|
37 }
|
Chris@39
|
38
|
Chris@39
|
39 int Device::maxInputChannels() const
|
Chris@39
|
40 {
|
Chris@39
|
41 if (info_ == NULL)
|
Chris@39
|
42 return 0;
|
Chris@39
|
43
|
Chris@39
|
44 return info_->maxInputChannels;
|
Chris@39
|
45 }
|
Chris@39
|
46
|
Chris@39
|
47 int Device::maxOutputChannels() const
|
Chris@39
|
48 {
|
Chris@39
|
49 if (info_ == NULL)
|
Chris@39
|
50 return 0;
|
Chris@39
|
51
|
Chris@39
|
52 return info_->maxOutputChannels;
|
Chris@39
|
53 }
|
Chris@39
|
54
|
Chris@39
|
55 PaTime Device::defaultLowInputLatency() const
|
Chris@39
|
56 {
|
Chris@39
|
57 if (info_ == NULL)
|
Chris@39
|
58 return static_cast<PaTime>(0.0);
|
Chris@39
|
59
|
Chris@39
|
60 return info_->defaultLowInputLatency;
|
Chris@39
|
61 }
|
Chris@39
|
62
|
Chris@39
|
63 PaTime Device::defaultHighInputLatency() const
|
Chris@39
|
64 {
|
Chris@39
|
65 if (info_ == NULL)
|
Chris@39
|
66 return static_cast<PaTime>(0.0);
|
Chris@39
|
67
|
Chris@39
|
68 return info_->defaultHighInputLatency;
|
Chris@39
|
69 }
|
Chris@39
|
70
|
Chris@39
|
71 PaTime Device::defaultLowOutputLatency() const
|
Chris@39
|
72 {
|
Chris@39
|
73 if (info_ == NULL)
|
Chris@39
|
74 return static_cast<PaTime>(0.0);
|
Chris@39
|
75
|
Chris@39
|
76 return info_->defaultLowOutputLatency;
|
Chris@39
|
77 }
|
Chris@39
|
78
|
Chris@39
|
79 PaTime Device::defaultHighOutputLatency() const
|
Chris@39
|
80 {
|
Chris@39
|
81 if (info_ == NULL)
|
Chris@39
|
82 return static_cast<PaTime>(0.0);
|
Chris@39
|
83
|
Chris@39
|
84 return info_->defaultHighOutputLatency;
|
Chris@39
|
85 }
|
Chris@39
|
86
|
Chris@39
|
87 double Device::defaultSampleRate() const
|
Chris@39
|
88 {
|
Chris@39
|
89 if (info_ == NULL)
|
Chris@39
|
90 return 0.0;
|
Chris@39
|
91
|
Chris@39
|
92 return info_->defaultSampleRate;
|
Chris@39
|
93 }
|
Chris@39
|
94
|
Chris@39
|
95 // -------------------------------------------------------------------------------
|
Chris@39
|
96
|
Chris@39
|
97 bool Device::isInputOnlyDevice() const
|
Chris@39
|
98 {
|
Chris@39
|
99 return (maxOutputChannels() == 0);
|
Chris@39
|
100 }
|
Chris@39
|
101
|
Chris@39
|
102 bool Device::isOutputOnlyDevice() const
|
Chris@39
|
103 {
|
Chris@39
|
104 return (maxInputChannels() == 0);
|
Chris@39
|
105 }
|
Chris@39
|
106
|
Chris@39
|
107 bool Device::isFullDuplexDevice() const
|
Chris@39
|
108 {
|
Chris@39
|
109 return (maxInputChannels() > 0 && maxOutputChannels() > 0);
|
Chris@39
|
110 }
|
Chris@39
|
111
|
Chris@39
|
112 bool Device::isSystemDefaultInputDevice() const
|
Chris@39
|
113 {
|
Chris@39
|
114 return (System::instance().defaultInputDevice() == *this);
|
Chris@39
|
115 }
|
Chris@39
|
116
|
Chris@39
|
117 bool Device::isSystemDefaultOutputDevice() const
|
Chris@39
|
118 {
|
Chris@39
|
119 return (System::instance().defaultOutputDevice() == *this);
|
Chris@39
|
120 }
|
Chris@39
|
121
|
Chris@39
|
122 bool Device::isHostApiDefaultInputDevice() const
|
Chris@39
|
123 {
|
Chris@39
|
124 return (hostApi().defaultInputDevice() == *this);
|
Chris@39
|
125 }
|
Chris@39
|
126
|
Chris@39
|
127 bool Device::isHostApiDefaultOutputDevice() const
|
Chris@39
|
128 {
|
Chris@39
|
129 return (hostApi().defaultOutputDevice() == *this);
|
Chris@39
|
130 }
|
Chris@39
|
131
|
Chris@39
|
132 // -------------------------------------------------------------------------------
|
Chris@39
|
133
|
Chris@39
|
134 bool Device::operator==(const Device &rhs)
|
Chris@39
|
135 {
|
Chris@39
|
136 return (index_ == rhs.index_);
|
Chris@39
|
137 }
|
Chris@39
|
138
|
Chris@39
|
139 bool Device::operator!=(const Device &rhs)
|
Chris@39
|
140 {
|
Chris@39
|
141 return !(*this == rhs);
|
Chris@39
|
142 }
|
Chris@39
|
143
|
Chris@39
|
144 // -------------------------------------------------------------------------------
|
Chris@39
|
145
|
Chris@39
|
146 HostApi &Device::hostApi()
|
Chris@39
|
147 {
|
Chris@39
|
148 // NOTE: will cause an exception when called for the null device
|
Chris@39
|
149 if (info_ == NULL)
|
Chris@39
|
150 throw PaException(paInternalError);
|
Chris@39
|
151
|
Chris@39
|
152 return System::instance().hostApiByIndex(info_->hostApi);
|
Chris@39
|
153 }
|
Chris@39
|
154
|
Chris@39
|
155 const HostApi &Device::hostApi() const
|
Chris@39
|
156 {
|
Chris@39
|
157 // NOTE; will cause an exception when called for the null device
|
Chris@39
|
158 if (info_ == NULL)
|
Chris@39
|
159 throw PaException(paInternalError);
|
Chris@39
|
160
|
Chris@39
|
161 return System::instance().hostApiByIndex(info_->hostApi);
|
Chris@39
|
162 }
|
Chris@39
|
163
|
Chris@39
|
164 // -------------------------------------------------------------------------------
|
Chris@39
|
165
|
Chris@39
|
166 } // namespace portaudio
|
Chris@39
|
167
|
Chris@39
|
168
|