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