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