Browse Source

Merge remote-tracking branch 'upstream/pr/136'

tags/5.1.0
Stephen Sinclair 7 years ago
parent
commit
f4061fcdde
7 changed files with 276 additions and 1 deletions
  1. +141
    -0
      RtAudio.cpp
  2. +25
    -0
      RtAudio.h
  3. +19
    -0
      rtaudio_c.cpp
  4. +3
    -0
      rtaudio_c.h
  5. +3
    -0
      tests/CMakeLists.txt
  6. +4
    -1
      tests/Makefile.am
  7. +81
    -0
      tests/apinames.cpp

+ 141
- 0
RtAudio.cpp View File

@@ -133,6 +133,147 @@ void RtAudio :: getCompiledApi( std::vector<RtAudio::Api> &apis )
#endif
}

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" );
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;
}

RtAudio::Api RtAudio :: getCompiledApiByName( const std::string &name )
{
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;

++api_number;
}

return RtAudio::UNSPECIFIED;
}

void RtAudio :: openRtApi( RtAudio::Api api )
{
if ( rtapi_ )


+ 25
- 0
RtAudio.h View File

@@ -397,6 +397,31 @@ class RTAUDIO_DLL_PUBLIC RtAudio
*/
static void getCompiledApi( std::vector<RtAudio::Api> &apis );

//! 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
against the list of compiled APIs, and return the one which
matches. On failure, the function returns UNSPECIFIED.
*/
static RtAudio::Api getCompiledApiByName( const std::string &name );

//! The class constructor.
/*!
The constructor performs minor initialization tasks. An exception


+ 19
- 0
rtaudio_c.cpp View File

@@ -50,6 +50,25 @@ const char *rtaudio_version() { return RTAUDIO_VERSION; }

const rtaudio_api_t *rtaudio_compiled_api() { return compiled_api; }

const char *rtaudio_compiled_api_name(rtaudio_api_t api) {
const std::string &name = RtAudio::getCompiledApiName((RtAudio::Api)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) {
api = RtAudio::getCompiledApiByName(name);
}
return (rtaudio_api_t)api;
}

const char *rtaudio_error(rtaudio_t audio) {
if (audio->has_error) {
return audio->errmsg;


+ 3
- 0
rtaudio_c.h View File

@@ -102,6 +102,9 @@ 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);



+ 3
- 0
tests/CMakeLists.txt View File

@@ -20,6 +20,9 @@ target_link_libraries(record ${LIBRTAUDIO} ${LINKLIBS})
add_executable(duplex duplex.cpp)
target_link_libraries(duplex ${LIBRTAUDIO} ${LINKLIBS})

add_executable(apinames apinames.cpp)
target_link_libraries(apinames rtaudio_static ${LINKLIBS})

add_executable(testall testall.cpp)
target_link_libraries(testall ${LIBRTAUDIO} ${LINKLIBS})



+ 4
- 1
tests/Makefile.am View File

@@ -1,5 +1,5 @@

noinst_PROGRAMS = audioprobe playsaw playraw record duplex testall teststops
noinst_PROGRAMS = audioprobe playsaw playraw record duplex apinames testall teststops

AM_CXXFLAGS = -Wall -I$(top_srcdir)

@@ -18,6 +18,9 @@ record_LDADD = $(top_builddir)/librtaudio.la
duplex_SOURCES = duplex.cpp
duplex_LDADD = $(top_builddir)/librtaudio.la

apinames_SOURCES = apinames.cpp
apinames_LDADD = $(top_builddir)/librtaudio.la

testall_SOURCES = testall.cpp
testall_LDADD = $(top_builddir)/librtaudio.la



+ 81
- 0
tests/apinames.cpp View File

@@ -0,0 +1,81 @@
/******************************************/
/*
apinames.cpp
by Jean Pierre Cimalando, 2018.

This program tests parts of RtAudio related
to API names, the conversion from name to API
and vice-versa.
*/
/******************************************/

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

int main() {
std::vector<RtAudio::Api> apis;
RtAudio::getCompiledApi( apis );

// ensure the known APIs return valid names
std::cout << "API names by identifier:\n";
for ( size_t i = 0; i < apis.size() ; ++i ) {
const std::string &name = RtAudio::getCompiledApiName(apis[i]);
if (name.empty()) {
std::cerr << "Invalid name for API " << (int)apis[i] << "\n";
exit(1);
}
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
{
const std::string &name = RtAudio::getCompiledApiName((RtAudio::Api)-1);
if (!name.empty()) {
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 name
std::cout << "API identifiers by name:\n";
for ( size_t i = 0; i < apis.size() ; ++i ) {
std::string name = RtAudio::getCompiledApiName(apis[i]);
if ( RtAudio::getCompiledApiByName(name) != apis[i] ) {
std::cerr << "Bad identifier for API '" << name << "'\n";
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]);
RtAudio::Api api = RtAudio::getCompiledApiByName(name);
if ( api != RtAudio::UNSPECIFIED ) {
std::cerr << "Identifier " << (int)api << " for invalid API '" << name << "'\n";
exit( 1 );
}
}

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

return 0;
}

Loading…
Cancel
Save