cannam@162
|
1 #include <iostream>
|
cannam@162
|
2 #include "portaudiocpp/PortAudioCpp.hxx"
|
cannam@162
|
3
|
cannam@162
|
4 #ifdef WIN32
|
cannam@162
|
5 #include "portaudiocpp/AsioDeviceAdapter.hxx"
|
cannam@162
|
6 #endif
|
cannam@162
|
7
|
cannam@162
|
8 // ---------------------------------------------------------------------------------------
|
cannam@162
|
9
|
cannam@162
|
10 void printSupportedStandardSampleRates(
|
cannam@162
|
11 const portaudio::DirectionSpecificStreamParameters &inputParameters,
|
cannam@162
|
12 const portaudio::DirectionSpecificStreamParameters &outputParameters)
|
cannam@162
|
13 {
|
cannam@162
|
14 static double STANDARD_SAMPLE_RATES[] = {
|
cannam@162
|
15 8000.0, 9600.0, 11025.0, 12000.0, 16000.0, 22050.0, 24000.0, 32000.0,
|
cannam@162
|
16 44100.0, 48000.0, 88200.0, 96000.0, -1 }; // negative terminated list
|
cannam@162
|
17
|
cannam@162
|
18 int printCount = 0;
|
cannam@162
|
19
|
cannam@162
|
20 for (int i = 0; STANDARD_SAMPLE_RATES[i] > 0; ++i)
|
cannam@162
|
21 {
|
cannam@162
|
22 portaudio::StreamParameters tmp = portaudio::StreamParameters(inputParameters, outputParameters, STANDARD_SAMPLE_RATES[i], 0, paNoFlag);
|
cannam@162
|
23
|
cannam@162
|
24 if (tmp.isSupported())
|
cannam@162
|
25 {
|
cannam@162
|
26 if (printCount == 0)
|
cannam@162
|
27 {
|
cannam@162
|
28 std::cout << " " << STANDARD_SAMPLE_RATES[i]; // 8.2
|
cannam@162
|
29 printCount = 1;
|
cannam@162
|
30 }
|
cannam@162
|
31 else if (printCount == 4)
|
cannam@162
|
32 {
|
cannam@162
|
33 std::cout << "," << std::endl;
|
cannam@162
|
34 std::cout << " " << STANDARD_SAMPLE_RATES[i]; // 8.2
|
cannam@162
|
35 printCount = 1;
|
cannam@162
|
36 }
|
cannam@162
|
37 else
|
cannam@162
|
38 {
|
cannam@162
|
39 std::cout << ", " << STANDARD_SAMPLE_RATES[i]; // 8.2
|
cannam@162
|
40 ++printCount;
|
cannam@162
|
41 }
|
cannam@162
|
42 }
|
cannam@162
|
43 }
|
cannam@162
|
44
|
cannam@162
|
45 if (printCount == 0)
|
cannam@162
|
46 std::cout << "None" << std::endl;
|
cannam@162
|
47 else
|
cannam@162
|
48 std::cout << std::endl;
|
cannam@162
|
49 }
|
cannam@162
|
50
|
cannam@162
|
51 // ---------------------------------------------------------------------------------------
|
cannam@162
|
52
|
cannam@162
|
53 int main(int, char*[]);
|
cannam@162
|
54 int main(int, char*[])
|
cannam@162
|
55 {
|
cannam@162
|
56 try
|
cannam@162
|
57 {
|
cannam@162
|
58 portaudio::AutoSystem autoSys;
|
cannam@162
|
59
|
cannam@162
|
60 portaudio::System &sys = portaudio::System::instance();
|
cannam@162
|
61
|
cannam@162
|
62 std::cout << "PortAudio version number = " << sys.version() << std::endl;
|
cannam@162
|
63 std::cout << "PortAudio version text = '" << sys.versionText() << "'" << std::endl;
|
cannam@162
|
64
|
cannam@162
|
65 int numDevices = sys.deviceCount();
|
cannam@162
|
66 std::cout << "Number of devices = " << numDevices << std::endl;
|
cannam@162
|
67
|
cannam@162
|
68 for (portaudio::System::DeviceIterator i = sys.devicesBegin(); i != sys.devicesEnd(); ++i)
|
cannam@162
|
69 {
|
cannam@162
|
70 std::cout << "--------------------------------------- device #" << (*i).index() << std::endl;
|
cannam@162
|
71
|
cannam@162
|
72 // Mark global and API specific default devices:
|
cannam@162
|
73 bool defaultDisplayed = false;
|
cannam@162
|
74
|
cannam@162
|
75 if ((*i).isSystemDefaultInputDevice())
|
cannam@162
|
76 {
|
cannam@162
|
77 std::cout << "[ Default Input";
|
cannam@162
|
78 defaultDisplayed = true;
|
cannam@162
|
79 }
|
cannam@162
|
80 else if ((*i).isHostApiDefaultInputDevice())
|
cannam@162
|
81 {
|
cannam@162
|
82 std::cout << "[ Default " << (*i).hostApi().name() << " Input";
|
cannam@162
|
83 defaultDisplayed = true;
|
cannam@162
|
84 }
|
cannam@162
|
85
|
cannam@162
|
86 if ((*i).isSystemDefaultOutputDevice())
|
cannam@162
|
87 {
|
cannam@162
|
88 std::cout << (defaultDisplayed ? "," : "[");
|
cannam@162
|
89 std::cout << " Default Output";
|
cannam@162
|
90 defaultDisplayed = true;
|
cannam@162
|
91 }
|
cannam@162
|
92 else if ((*i).isHostApiDefaultOutputDevice())
|
cannam@162
|
93 {
|
cannam@162
|
94 std::cout << (defaultDisplayed ? "," : "[");
|
cannam@162
|
95 std::cout << " Default " << (*i).hostApi().name() << " Output";
|
cannam@162
|
96 defaultDisplayed = true;
|
cannam@162
|
97 }
|
cannam@162
|
98
|
cannam@162
|
99 if (defaultDisplayed)
|
cannam@162
|
100 std::cout << " ]" << std::endl;
|
cannam@162
|
101
|
cannam@162
|
102 // Print device info:
|
cannam@162
|
103 std::cout << "Name = " << (*i).name() << std::endl;
|
cannam@162
|
104 std::cout << "Host API = " << (*i).hostApi().name() << std::endl;
|
cannam@162
|
105 std::cout << "Max inputs = " << (*i).maxInputChannels() << ", Max outputs = " << (*i).maxOutputChannels() << std::endl;
|
cannam@162
|
106
|
cannam@162
|
107 std::cout << "Default low input latency = " << (*i).defaultLowInputLatency() << std::endl; // 8.3
|
cannam@162
|
108 std::cout << "Default low output latency = " << (*i).defaultLowOutputLatency() << std::endl; // 8.3
|
cannam@162
|
109 std::cout << "Default high input latency = " << (*i).defaultHighInputLatency() << std::endl; // 8.3
|
cannam@162
|
110 std::cout << "Default high output latency = " << (*i).defaultHighOutputLatency() << std::endl; // 8.3
|
cannam@162
|
111
|
cannam@162
|
112 #ifdef WIN32
|
cannam@162
|
113 // ASIO specific latency information:
|
cannam@162
|
114 if ((*i).hostApi().typeId() == paASIO)
|
cannam@162
|
115 {
|
cannam@162
|
116 portaudio::AsioDeviceAdapter asioDevice((*i));
|
cannam@162
|
117
|
cannam@162
|
118 std::cout << "ASIO minimum buffer size = " << asioDevice.minBufferSize() << std::endl;
|
cannam@162
|
119 std::cout << "ASIO maximum buffer size = " << asioDevice.maxBufferSize() << std::endl;
|
cannam@162
|
120 std::cout << "ASIO preferred buffer size = " << asioDevice.preferredBufferSize() << std::endl;
|
cannam@162
|
121
|
cannam@162
|
122 if (asioDevice.granularity() == -1)
|
cannam@162
|
123 std::cout << "ASIO buffer granularity = power of 2" << std::endl;
|
cannam@162
|
124 else
|
cannam@162
|
125 std::cout << "ASIO buffer granularity = " << asioDevice.granularity() << std::endl;
|
cannam@162
|
126 }
|
cannam@162
|
127 #endif // WIN32
|
cannam@162
|
128
|
cannam@162
|
129 std::cout << "Default sample rate = " << (*i).defaultSampleRate() << std::endl; // 8.2
|
cannam@162
|
130
|
cannam@162
|
131 // Poll for standard sample rates:
|
cannam@162
|
132 portaudio::DirectionSpecificStreamParameters inputParameters((*i), (*i).maxInputChannels(), portaudio::INT16, true, 0.0, NULL);
|
cannam@162
|
133 portaudio::DirectionSpecificStreamParameters outputParameters((*i), (*i).maxOutputChannels(), portaudio::INT16, true, 0.0, NULL);
|
cannam@162
|
134
|
cannam@162
|
135 if (inputParameters.numChannels() > 0)
|
cannam@162
|
136 {
|
cannam@162
|
137 std::cout << "Supported standard sample rates" << std::endl;
|
cannam@162
|
138 std::cout << " for half-duplex 16 bit " << inputParameters.numChannels() << " channel input = " << std::endl;
|
cannam@162
|
139 printSupportedStandardSampleRates(inputParameters, portaudio::DirectionSpecificStreamParameters::null());
|
cannam@162
|
140 }
|
cannam@162
|
141
|
cannam@162
|
142 if (outputParameters.numChannels() > 0)
|
cannam@162
|
143 {
|
cannam@162
|
144 std::cout << "Supported standard sample rates" << std::endl;
|
cannam@162
|
145 std::cout << " for half-duplex 16 bit " << outputParameters.numChannels() << " channel output = " << std::endl;
|
cannam@162
|
146 printSupportedStandardSampleRates(portaudio::DirectionSpecificStreamParameters::null(), outputParameters);
|
cannam@162
|
147 }
|
cannam@162
|
148
|
cannam@162
|
149 if (inputParameters.numChannels() > 0 && outputParameters.numChannels() > 0)
|
cannam@162
|
150 {
|
cannam@162
|
151 std::cout << "Supported standard sample rates" << std::endl;
|
cannam@162
|
152 std::cout << " for full-duplex 16 bit " << inputParameters.numChannels() << " channel input, " << outputParameters.numChannels() << " channel output = " << std::endl;
|
cannam@162
|
153 printSupportedStandardSampleRates(inputParameters, outputParameters);
|
cannam@162
|
154 }
|
cannam@162
|
155 }
|
cannam@162
|
156
|
cannam@162
|
157 std::cout << "----------------------------------------------" << std::endl;
|
cannam@162
|
158 }
|
cannam@162
|
159 catch (const portaudio::PaException &e)
|
cannam@162
|
160 {
|
cannam@162
|
161 std::cout << "A PortAudio error occured: " << e.paErrorText() << std::endl;
|
cannam@162
|
162 }
|
cannam@162
|
163 catch (const portaudio::PaCppException &e)
|
cannam@162
|
164 {
|
cannam@162
|
165 std::cout << "A PortAudioCpp error occured: " << e.what() << std::endl;
|
cannam@162
|
166 }
|
cannam@162
|
167 catch (const std::exception &e)
|
cannam@162
|
168 {
|
cannam@162
|
169 std::cout << "A generic exception occured: " << e.what() << std::endl;
|
cannam@162
|
170 }
|
cannam@162
|
171 catch (...)
|
cannam@162
|
172 {
|
cannam@162
|
173 std::cout << "An unknown exception occured." << std::endl;
|
cannam@162
|
174 }
|
cannam@162
|
175
|
cannam@162
|
176 return 0;
|
cannam@162
|
177 }
|