diff options
| author | Stephen Sinclair <radarsat1@gmail.com> | 2018-08-08 11:55:39 -0400 |
|---|---|---|
| committer | Stephen Sinclair <radarsat1@gmail.com> | 2018-08-08 11:55:39 -0400 |
| commit | 3d054aec68641b049c102d20632a1eb618355a6f (patch) | |
| tree | d5cf7f0210939376e5d56b49a66ae3723f364fb1 /RtAudio.cpp | |
| parent | f4061fcddede498baf9c7315c3922eb60b23bb40 (diff) | |
Use a map for API names
Diffstat (limited to 'RtAudio.cpp')
| -rw-r--r-- | RtAudio.cpp | 201 |
1 files changed, 56 insertions, 145 deletions
diff --git a/RtAudio.cpp b/RtAudio.cpp index 728b4a3..7b7c8ef 100644 --- a/RtAudio.cpp +++ b/RtAudio.cpp @@ -98,180 +98,91 @@ std::string RtAudio :: getVersion( void ) return RTAUDIO_VERSION; } -void RtAudio :: getCompiledApi( std::vector<RtAudio::Api> &apis ) -{ - apis.clear(); - - // The order here will control the order of RtAudio's API search in - // the constructor. +// Define API names. +// TODO: replace with initializer list in C++11. +// The order here will control the order of RtAudio's API search in +// the constructor. +// Have to maintain a separate list of API enum identifiers since map +// doesn't preserve insertion order. +static std::pair< RtAudio::ApiNameMap, std::vector<RtAudio::Api> > init_ApiNames() +{ + RtAudio::ApiNameMap names; + std::vector<RtAudio::Api> apis; #if defined(__UNIX_JACK__) - apis.push_back( UNIX_JACK ); + names["jack"] = std::pair<RtAudio::Api, std::string>(RtAudio::UNIX_JACK, "Jack"); + apis.push_back(RtAudio::UNIX_JACK); #endif #if defined(__LINUX_PULSE__) - apis.push_back( LINUX_PULSE ); + names["pulse"] = std::pair<RtAudio::Api, std::string>(RtAudio::LINUX_PULSE, "Pulse"); + apis.push_back(RtAudio::LINUX_PULSE); #endif #if defined(__LINUX_ALSA__) - apis.push_back( LINUX_ALSA ); + names["alsa"] = std::pair<RtAudio::Api, std::string>(RtAudio::LINUX_ALSA, "ALSA"); + apis.push_back(RtAudio::LINUX_ALSA); #endif #if defined(__LINUX_OSS__) - apis.push_back( LINUX_OSS ); + names["oss"] = std::pair<RtAudio::Api, std::string>(RtAudio::LINUX_OSS, "OSS"); + apis.push_back(RtAudio::LINUX_OSS); #endif #if defined(__WINDOWS_ASIO__) - apis.push_back( WINDOWS_ASIO ); + names["asio"] = std::pair<RtAudio::Api, std::string>(RtAudio::WINDOWS_ASIO, "ASIO"); + apis.push_back(RtAudio::WINDOWS_ASIO); #endif #if defined(__WINDOWS_WASAPI__) - apis.push_back( WINDOWS_WASAPI ); + names["wasapi"] = std::pair<RtAudio::Api, std::string>(RtAudio::WINDOWS_WASAPI, "WASAPI"); + apis.push_back(RtAudio::WINDOWS_WASAPI); #endif #if defined(__WINDOWS_DS__) - apis.push_back( WINDOWS_DS ); + names["ds"] = std::pair<RtAudio::Api, std::string>(RtAudio::WINDOWS_DS, "DirectSound"); + apis.push_back(RtAudio::WINDOWS_DS); #endif #if defined(__MACOSX_CORE__) - apis.push_back( MACOSX_CORE ); + names["core"] = std::pair<RtAudio::Api, std::string>(RtAudio::MACOSX_CORE, "CoreAudio"); + apis.push_back(RtAudio::MACOSX_CORE); #endif #if defined(__RTAUDIO_DUMMY__) - apis.push_back( RTAUDIO_DUMMY ); + names["dummy"] = std::pair<RtAudio::Api, std::string>(RtAudio::RTAUDIO_DUMMY, "Dummy"); + apis.push_back(RtAudio::RTAUDIO_DUMMY); #endif + return std::make_pair(names, apis); } -const std::string &RtAudio :: getCompiledApiName( RtAudio::Api api ) +const RtAudio::ApiNameMap RtAudio::apiNames(init_ApiNames().first); +const std::vector<RtAudio::Api> RtAudio::compiledApis(init_ApiNames().second); + +void RtAudio :: getCompiledApi( std::vector<RtAudio::Api> &apis ) { -#if defined(__UNIX_JACK__) - if ( api == UNIX_JACK ) { - static std::string name( "jack" ); - return name; - } -#endif -#if defined(__LINUX_PULSE__) - if ( api == LINUX_PULSE ) { - static std::string name( "pulse" ); - return name; - } -#endif -#if defined(__LINUX_ALSA__) - if ( api == LINUX_ALSA ) { - static std::string name( "alsa" ); - return name; - } -#endif -#if defined(__LINUX_OSS__) - if ( api == LINUX_OSS ) { - static std::string name( "oss" ); - return name; - } -#endif -#if defined(__WINDOWS_ASIO__) - if ( api == WINDOWS_ASIO ) { - static std::string name( "asio" ); - return name; - } -#endif -#if defined(__WINDOWS_WASAPI__) - if ( api == WINDOWS_WASAPI ) { - static std::string name( "wasapi" ); - return name; - } -#endif -#if defined(__WINDOWS_DS__) - if ( api == WINDOWS_DS ) { - static std::string name( "ds" ); - return name; - } -#endif -#if defined(__MACOSX_CORE__) - if ( api == MACOSX_CORE ) { - static std::string name( "core" ); - return name; - } -#endif -#if defined(__RTAUDIO_DUMMY__) - if ( api == RTAUDIO_DUMMY ) { - static std::string name( "dummy" ); - return name; - } -#endif - static std::string name; - return name; + apis = compiledApis; } -const std::string &RtAudio :: getCompiledApiDisplayName( RtAudio::Api api ) +const std::vector<RtAudio::Api>& RtAudio :: getCompiledApi() { -#if defined(__UNIX_JACK__) - if ( api == UNIX_JACK ) { - static std::string name( "JACK" ); - return name; - } -#endif -#if defined(__LINUX_PULSE__) - if ( api == LINUX_PULSE ) { - static std::string name( "PulseAudio" ); - return name; - } -#endif -#if defined(__LINUX_ALSA__) - if ( api == LINUX_ALSA ) { - static std::string name( "ALSA" ); - return name; - } -#endif -#if defined(__LINUX_OSS__) - if ( api == LINUX_OSS ) { - static std::string name( "OSS" ); - return name; - } -#endif -#if defined(__WINDOWS_ASIO__) - if ( api == WINDOWS_ASIO ) { - static std::string name( "ASIO" ); - return name; - } -#endif -#if defined(__WINDOWS_WASAPI__) - if ( api == WINDOWS_WASAPI ) { - static std::string name( "WASAPI" ); - return name; - } -#endif -#if defined(__WINDOWS_DS__) - if ( api == WINDOWS_DS ) { - static std::string name( "DirectSound" ); - return name; - } -#endif -#if defined(__MACOSX_CORE__) - if ( api == MACOSX_CORE ) { - static std::string name( "Core Audio" ); - return name; - } -#endif -#if defined(__RTAUDIO_DUMMY__) - if ( api == RTAUDIO_DUMMY ) { - static std::string name( "RtAudio Dummy" ); - return name; - } -#endif - static std::string name; - return name; + return compiledApis; } -RtAudio::Api RtAudio :: getCompiledApiByName( const std::string &name ) +const std::string RtAudio :: getCompiledApiName( RtAudio::Api api ) { - unsigned int api_number = RtAudio::UNSPECIFIED; - size_t nameLength = name.size(); - - if ( nameLength == 0 ) - return RtAudio::UNSPECIFIED; - - while ( api_number <= RtAudio::RTAUDIO_DUMMY ) { - const std::string &otherName = - getCompiledApiName((RtAudio::Api)api_number); - - if ( name == otherName ) - return (RtAudio::Api)api_number; + ApiNameMap::const_iterator it; + for (it = apiNames.begin(); it != apiNames.end(); it++) + if (it->second.first == api) + return it->first; + return ""; +} - ++api_number; - } +const std::string RtAudio :: getCompiledApiDisplayName( RtAudio::Api api ) +{ + ApiNameMap::const_iterator it; + for (it = apiNames.begin(); it != apiNames.end(); it++) + if (it->second.first == api) + return it->second.second; + return "Unknown"; +} - return RtAudio::UNSPECIFIED; +RtAudio::Api RtAudio :: getCompiledApiByName( const std::string &name ) +{ + if (apiNames.find(name) == apiNames.end()) + return RtAudio::UNSPECIFIED; + return apiNames.at(name).first; } void RtAudio :: openRtApi( RtAudio::Api api ) |
