+ RtAudio::UNSPECIFIED,
+};
+const unsigned int rtaudio_num_compiled_apis =
+ sizeof(rtaudio_compiled_apis)/sizeof(rtaudio_compiled_apis[0])-1;
+}
+
+// TODO: replace this with something nicer (C++11)
+static const std::vector<RtAudio::Api> init_compiledApis() {
+ std::vector<RtAudio::Api> apis;
+ for (unsigned int i=0; i<rtaudio_num_compiled_apis; i++)
+ apis.push_back(rtaudio_compiled_apis[i]);
+ return apis;
+}
+const std::vector<RtAudio::Api> RtAudio::compiledApis(init_compiledApis());
+
+// This is a compile-time check that rtaudio_num_api_names == RtAudio::NUM_APIS.
+// If the build breaks here, check that they match.
+template<bool b> class StaticAssert { private: StaticAssert() {} };
+template<> class StaticAssert<true>{ public: StaticAssert() {} };
+class StaticAssertions { StaticAssertions() {
+ StaticAssert<rtaudio_num_api_names == RtAudio::NUM_APIS>();
+}};
+
+void RtAudio :: getCompiledApi( std::vector<RtAudio::Api> &apis )
+{
+ apis = compiledApis;
+}
+
+const std::vector<RtAudio::Api>& RtAudio :: getCompiledApi()
+{
+ return compiledApis;
+}
+
+const std::string RtAudio :: getCompiledApiName( RtAudio::Api api )
+{
+ if (api < 0 || api > RtAudio::NUM_APIS
+ || (std::find(RtAudio::compiledApis.begin(),
+ RtAudio::compiledApis.end(), api) == RtAudio::compiledApis.end()))
+ return "";
+ return rtaudio_api_names[api][0];
+}
+
+const std::string RtAudio :: getCompiledApiDisplayName( RtAudio::Api api )
+{
+ if (api < 0 || api > RtAudio::NUM_APIS
+ || (std::find(RtAudio::compiledApis.begin(),
+ RtAudio::compiledApis.end(), api) == RtAudio::compiledApis.end()))
+ return "Unknown";
+ return rtaudio_api_names[api][1];
+}
+
+RtAudio::Api RtAudio :: getCompiledApiByName( const std::string &name )
+{
+ unsigned int i=0;
+ std::vector<RtAudio::Api>::const_iterator it;
+ for (it = compiledApis.begin(); it != compiledApis.end(); ++it, ++i)
+ if (name == rtaudio_api_names[*it][0])
+ return *it;
+ return RtAudio::UNSPECIFIED;