Browse Source

Use short lower-case names as API identifiers

tags/5.1.0
JP Cimalando 6 years ago
parent
commit
021928773b
5 changed files with 98 additions and 21 deletions
  1. +64
    -10
      RtAudio.cpp
  2. +10
    -0
      RtAudio.h
  3. +6
    -0
      rtaudio_c.cpp
  4. +1
    -0
      rtaudio_c.h
  5. +17
    -11
      tests/apinames.cpp

+ 64
- 10
RtAudio.cpp View File

@@ -45,7 +45,6 @@
#include <cstdlib>
#include <cstring>
#include <climits>
#include <cctype>
#include <cmath>
#include <algorithm>

@@ -136,6 +135,66 @@ void RtAudio :: getCompiledApi( std::vector<RtAudio::Api> &apis )

const std::string &RtAudio :: getCompiledApiName( RtAudio::Api api )
{
#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;
}

const std::string &RtAudio :: getCompiledApiDisplayName( RtAudio::Api api )
{
#if defined(__UNIX_JACK__)
if ( api == UNIX_JACK ) {
static std::string name( "JACK" );
@@ -180,13 +239,13 @@ const std::string &RtAudio :: getCompiledApiName( RtAudio::Api api )
#endif
#if defined(__MACOSX_CORE__)
if ( api == MACOSX_CORE ) {
static std::string name( "CoreAudio" );
static std::string name( "Core Audio" );
return name;
}
#endif
#if defined(__RTAUDIO_DUMMY__)
if ( api == RTAUDIO_DUMMY ) {
static std::string name( "Dummy" );
static std::string name( "RtAudio Dummy" );
return name;
}
#endif
@@ -206,18 +265,13 @@ RtAudio::Api RtAudio :: getCompiledApiByName( const std::string &name )
const std::string &otherName =
getCompiledApiName((RtAudio::Api)api_number);

bool equal = nameLength == otherName.size();
for ( size_t i = 0; equal && i < nameLength; ++i )
equal = tolower((unsigned char)name[i]) ==
tolower((unsigned char)otherName[i]);

if ( equal )
if ( name == otherName )
return (RtAudio::Api)api_number;

++api_number;
}

return RtAudio::UNSPECIFIED;
return RtAudio::UNSPECIFIED;
}

void RtAudio :: openRtApi( RtAudio::Api api )


+ 10
- 0
RtAudio.h View File

@@ -399,11 +399,21 @@ class RTAUDIO_DLL_PUBLIC RtAudio

//! Return the name of a specified compiled audio API.
/*!
This obtains a short lower-case name used for identification purposes.
This value is guaranteed to remain identical across library versions.
If the API is unknown or not compiled, this function will return
the empty string.
*/
static const std::string &getCompiledApiName( RtAudio::Api api );

//! Return the display name of a specified compiled audio API.
/*!
This obtains a long name used for display purposes.
If the API is unknown or not compiled, this function will return
the empty string.
*/
static const std::string &getCompiledApiDisplayName( RtAudio::Api api );

//! Return the compiled audio API having the given name.
/*!
A case insensitive comparison will check the specified name


+ 6
- 0
rtaudio_c.cpp View File

@@ -55,6 +55,12 @@ const char *rtaudio_compiled_api_name(rtaudio_api_t api) {
return name.empty() ? NULL : name.c_str();
}

const char *rtaudio_compiled_api_display_name(rtaudio_api_t api)
{
const std::string &name = RtAudio::getCompiledApiDisplayName((RtAudio::Api)api);
return name.empty() ? NULL : name.c_str();
}

rtaudio_api_t rtaudio_compiled_api_by_name(const char *name) {
RtAudio::Api api = RtAudio::UNSPECIFIED;
if (name) {


+ 1
- 0
rtaudio_c.h View File

@@ -103,6 +103,7 @@ typedef struct rtaudio *rtaudio_t;
RTAUDIOAPI const char *rtaudio_version(void);
RTAUDIOAPI const rtaudio_api_t *rtaudio_compiled_api(void);
RTAUDIOAPI const char *rtaudio_compiled_api_name(rtaudio_api_t api);
RTAUDIOAPI const char *rtaudio_compiled_api_display_name(rtaudio_api_t api);
RTAUDIOAPI rtaudio_api_t rtaudio_compiled_api_by_name(const char *name);

RTAUDIOAPI const char *rtaudio_error(rtaudio_t audio);


+ 17
- 11
tests/apinames.cpp View File

@@ -10,8 +10,8 @@
/******************************************/

#include "RtAudio.h"
#include <cstdlib>
#include <cctype>
#include <cstdlib>
#include <iostream>

int main() {
@@ -26,7 +26,12 @@ int main() {
std::cerr << "Invalid name for API " << (int)apis[i] << "\n";
exit(1);
}
std::cout << "* " << (int)apis[i] << ": '" << name << "'\n";
const std::string &displayName = RtAudio::getCompiledApiDisplayName(apis[i]);
if (displayName.empty()) {
std::cerr << "Invalid display name for API " << (int)apis[i] << "\n";
exit(1);
}
std::cout << "* " << (int)apis[i] << " '" << name << "': '" << displayName << "'\n";
}

// ensure unknown APIs return the empty string
@@ -36,9 +41,14 @@ int main() {
std::cerr << "Bad string for invalid API\n";
exit(1);
}
const std::string &displayName = RtAudio::getCompiledApiDisplayName((RtAudio::Api)-1);
if (!displayName.empty()) {
std::cerr << "Bad display string for invalid API\n";
exit(1);
}
}

// try getting API identifier by case-insensitive name
// try getting API identifier by name
std::cout << "API identifiers by name:\n";
for ( size_t i = 0; i < apis.size() ; ++i ) {
std::string name = RtAudio::getCompiledApiName(apis[i]);
@@ -47,23 +57,19 @@ int main() {
exit( 1 );
}
std::cout << "* '" << name << "': " << (int)apis[i] << "\n";

for ( size_t j = 0; j < name.size(); ++j )
name[j] = (j & 1) ? toupper(name[j]) : tolower(name[j]);
if ( RtAudio::getCompiledApiByName(name) != apis[i] ) {
std::cerr << "Bad identifier for API '" << name << "'\n";
RtAudio::Api api = RtAudio::getCompiledApiByName(name);
if ( api != RtAudio::UNSPECIFIED ) {
std::cerr << "Identifier " << (int)api << " for invalid API '" << name << "'\n";
exit( 1 );
}
std::cout << "* '" << name << "': " << (int)apis[i] << "\n";
}

// try getting an API identifier by unknown name
{
RtAudio::Api api;
api = RtAudio::getCompiledApiByName("ALSO");
if ( api != RtAudio::UNSPECIFIED ) {
std::cerr << "Bad identifier for unknown API name\n";
exit( 1 );
}
api = RtAudio::getCompiledApiByName("");
if ( api != RtAudio::UNSPECIFIED ) {
std::cerr << "Bad identifier for unknown API name\n";


Loading…
Cancel
Save