[DEV] add basic tools and change some API

This commit is contained in:
Edouard DUPIN 2015-06-11 21:39:56 +02:00
parent bb16adc099
commit fa618958b8
22 changed files with 166 additions and 128 deletions

View File

@ -55,7 +55,7 @@ namespace audio {
void setName(const std::string& _name) { void setName(const std::string& _name) {
m_name = _name; m_name = _name;
} }
virtual audio::orchestra::type getCurrentApi() = 0; virtual const std::string& getCurrentApi() = 0;
virtual uint32_t getDeviceCount() = 0; virtual uint32_t getDeviceCount() = 0;
virtual audio::orchestra::DeviceInfo getDeviceInfo(uint32_t _device) = 0; virtual audio::orchestra::DeviceInfo getDeviceInfo(uint32_t _device) = 0;
// TODO : Check API ... // TODO : Check API ...
@ -173,9 +173,5 @@ namespace audio {
}; };
} }
} }
/**
* @brief Debug operator To display the curent element in a Human redeable information
*/
std::ostream& operator <<(std::ostream& _os, const audio::orchestra::type& _obj);
#endif #endif

View File

@ -13,8 +13,8 @@
#undef __class__ #undef __class__
#define __class__ "Interface" #define __class__ "Interface"
std::vector<enum audio::orchestra::type> audio::orchestra::Interface::getCompiledApi() { std::vector<std::string> audio::orchestra::Interface::getListApi() {
std::vector<enum audio::orchestra::type> apis; std::vector<std::string> apis;
// The order here will control the order of RtAudio's API search in // The order here will control the order of RtAudio's API search in
// the constructor. // the constructor.
for (size_t iii=0; iii<m_apiAvaillable.size(); ++iii) { for (size_t iii=0; iii<m_apiAvaillable.size(); ++iii) {
@ -25,7 +25,7 @@ std::vector<enum audio::orchestra::type> audio::orchestra::Interface::getCompile
void audio::orchestra::Interface::openRtApi(enum audio::orchestra::type _api) { void audio::orchestra::Interface::openApi(const std::string& _api) {
delete m_rtapi; delete m_rtapi;
m_rtapi = nullptr; m_rtapi = nullptr;
for (size_t iii=0; iii<m_apiAvaillable.size(); ++iii) { for (size_t iii=0; iii<m_apiAvaillable.size(); ++iii) {
@ -47,61 +47,62 @@ audio::orchestra::Interface::Interface() :
m_rtapi(nullptr) { m_rtapi(nullptr) {
ATA_DEBUG("Add interface:"); ATA_DEBUG("Add interface:");
#if defined(ORCHESTRA_BUILD_JACK) #if defined(ORCHESTRA_BUILD_JACK)
ATA_DEBUG(" JACK");
addInterface(audio::orchestra::type_jack, audio::orchestra::api::Jack::create); addInterface(audio::orchestra::type_jack, audio::orchestra::api::Jack::create);
#endif #endif
#if defined(ORCHESTRA_BUILD_ALSA) #if defined(ORCHESTRA_BUILD_ALSA)
ATA_DEBUG(" ALSA");
addInterface(audio::orchestra::type_alsa, audio::orchestra::api::Alsa::create); addInterface(audio::orchestra::type_alsa, audio::orchestra::api::Alsa::create);
#endif #endif
#if defined(ORCHESTRA_BUILD_PULSE) #if defined(ORCHESTRA_BUILD_PULSE)
ATA_DEBUG(" PULSE");
addInterface(audio::orchestra::type_pulse, audio::orchestra::api::Pulse::create); addInterface(audio::orchestra::type_pulse, audio::orchestra::api::Pulse::create);
#endif #endif
#if defined(ORCHESTRA_BUILD_OSS) #if defined(ORCHESTRA_BUILD_OSS)
ATA_DEBUG(" OSS");
addInterface(audio::orchestra::type_oss, audio::orchestra::api::Oss::create); addInterface(audio::orchestra::type_oss, audio::orchestra::api::Oss::create);
#endif #endif
#if defined(ORCHESTRA_BUILD_ASIO) #if defined(ORCHESTRA_BUILD_ASIO)
ATA_DEBUG(" ASIO");
addInterface(audio::orchestra::type_asio, audio::orchestra::api::Asio::create); addInterface(audio::orchestra::type_asio, audio::orchestra::api::Asio::create);
#endif #endif
#if defined(ORCHESTRA_BUILD_DS) #if defined(ORCHESTRA_BUILD_DS)
ATA_DEBUG(" DS");
addInterface(audio::orchestra::type_ds, audio::orchestra::api::Ds::create); addInterface(audio::orchestra::type_ds, audio::orchestra::api::Ds::create);
#endif #endif
#if defined(ORCHESTRA_BUILD_MACOSX_CORE) #if defined(ORCHESTRA_BUILD_MACOSX_CORE)
ATA_DEBUG(" CORE OSX");
addInterface(audio::orchestra::type_coreOSX, audio::orchestra::api::Core::create); addInterface(audio::orchestra::type_coreOSX, audio::orchestra::api::Core::create);
#endif #endif
#if defined(ORCHESTRA_BUILD_IOS_CORE) #if defined(ORCHESTRA_BUILD_IOS_CORE)
ATA_DEBUG(" CORE IOS");
addInterface(audio::orchestra::type_coreIOS, audio::orchestra::api::CoreIos::create); addInterface(audio::orchestra::type_coreIOS, audio::orchestra::api::CoreIos::create);
#endif #endif
#if defined(ORCHESTRA_BUILD_JAVA) #if defined(ORCHESTRA_BUILD_JAVA)
ATA_DEBUG(" JAVA");
addInterface(audio::orchestra::type_java, audio::orchestra::api::Android::create); addInterface(audio::orchestra::type_java, audio::orchestra::api::Android::create);
#endif #endif
#if defined(ORCHESTRA_BUILD_DUMMY) #if defined(ORCHESTRA_BUILD_DUMMY)
ATA_DEBUG(" DUMMY");
addInterface(audio::orchestra::type_dummy, audio::orchestra::api::Dummy::create); addInterface(audio::orchestra::type_dummy, audio::orchestra::api::Dummy::create);
#endif #endif
} }
void audio::orchestra::Interface::addInterface(enum audio::orchestra::type _api, Api* (*_callbackCreate)()) { void audio::orchestra::Interface::addInterface(const std::string& _api, Api* (*_callbackCreate)()) {
m_apiAvaillable.push_back(std::pair<enum audio::orchestra::type, Api* (*)()>(_api, _callbackCreate)); m_apiAvaillable.push_back(std::pair<std::string, Api* (*)()>(_api, _callbackCreate));
} }
enum audio::orchestra::error audio::orchestra::Interface::instanciate(enum audio::orchestra::type _api) { enum audio::orchestra::error audio::orchestra::Interface::clear() {
ATA_INFO("Clear API ...");
if (m_rtapi == nullptr) {
ATA_WARNING("Interface NOT started!");
return audio::orchestra::error_none;
}
delete m_rtapi;
m_rtapi = nullptr;
return audio::orchestra::error_none;
}
enum audio::orchestra::error audio::orchestra::Interface::instanciate(const std::string& _api) {
ATA_INFO("Instanciate API ..."); ATA_INFO("Instanciate API ...");
if (m_rtapi != nullptr) { if (m_rtapi != nullptr) {
ATA_WARNING("Interface already started ...!"); ATA_WARNING("Interface already started!");
return audio::orchestra::error_none; return audio::orchestra::error_none;
} }
if (_api != audio::orchestra::type_undefined) { if (_api != audio::orchestra::type_undefined) {
ATA_INFO("API specified : " << _api); ATA_INFO("API specified : " << _api);
// Attempt to open the specified API. // Attempt to open the specified API.
openRtApi(_api); openApi(_api);
if (m_rtapi != nullptr) { if (m_rtapi != nullptr) {
if (m_rtapi->getDeviceCount() != 0) { if (m_rtapi->getDeviceCount() != 0) {
ATA_INFO(" ==> api open"); ATA_INFO(" ==> api open");
@ -116,11 +117,11 @@ enum audio::orchestra::error audio::orchestra::Interface::instanciate(enum audio
ATA_INFO("Auto choice API :"); ATA_INFO("Auto choice API :");
// Iterate through the compiled APIs and return as soon as we find // Iterate through the compiled APIs and return as soon as we find
// one with at least one device or we reach the end of the list. // one with at least one device or we reach the end of the list.
std::vector<enum audio::orchestra::type> apis = getCompiledApi(); std::vector<std::string> apis = getListApi();
ATA_INFO(" find : " << apis.size() << " apis."); ATA_INFO(" find : " << apis.size() << " apis.");
for (size_t iii=0; iii<apis.size(); ++iii) { for (size_t iii=0; iii<apis.size(); ++iii) {
ATA_INFO("try open ..."); ATA_INFO("try open ...");
openRtApi(apis[iii]); openApi(apis[iii]);
if(m_rtapi == nullptr) { if(m_rtapi == nullptr) {
ATA_ERROR(" ==> can not create ..."); ATA_ERROR(" ==> can not create ...");
continue; continue;

View File

@ -38,7 +38,7 @@ namespace audio {
*/ */
class Interface { class Interface {
protected: protected:
std::vector<std::pair<enum audio::orchestra::type, Api* (*)()> > m_apiAvaillable; std::vector<std::pair<std::string, Api* (*)()> > m_apiAvaillable;
protected: protected:
audio::orchestra::Api *m_rtapi; audio::orchestra::Api *m_rtapi;
public: public:
@ -50,13 +50,16 @@ namespace audio {
m_rtapi->setName(_name); m_rtapi->setName(_name);
} }
/** /**
* @brief A static function to determine the available compiled audio APIs. * @brief Get the list of all availlable API in the system.
* * @return the list of all APIs
* The values returned in the std::vector can be compared against
* the enumerated list values. Note that there can be more than one
* API compiled for certain operating systems.
*/ */
std::vector<enum audio::orchestra::type> getCompiledApi(); std::vector<std::string> getListApi();
/**
* @brief Add an interface of the Possible List.
* @param[in] _api Type of the interface.
* @param[in] _callbackCreate API creation callback.
*/
void addInterface(const std::string& _api, Api* (*_callbackCreate)());
/** /**
* @brief The class constructor. * @brief The class constructor.
* @note the creating of the basic instance is done by Instanciate * @note the creating of the basic instance is done by Instanciate
@ -70,19 +73,17 @@ namespace audio {
*/ */
virtual ~Interface(); virtual ~Interface();
/** /**
* @brief Add an interface of the Possible List. * @brief Clear the current Interface
* @param[in] _api Type of the interface.
* @param[in] _callbackCreate API creation callback.
*/ */
void addInterface(enum audio::orchestra::type _api, Api* (*_callbackCreate)()); enum audio::orchestra::error clear();
/** /**
* @brief Create an interface instance * @brief Create an interface instance
*/ */
enum audio::orchestra::error instanciate(enum audio::orchestra::type _api = audio::orchestra::type_undefined); enum audio::orchestra::error instanciate(const std::string& _api = audio::orchestra::type_undefined);
/** /**
* @return the audio API specifier for the current instance of airtaudio. * @return the audio API specifier for the current instance of airtaudio.
*/ */
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
if (m_rtapi == nullptr) { if (m_rtapi == nullptr) {
return audio::orchestra::type_undefined; return audio::orchestra::type_undefined;
} }
@ -312,7 +313,7 @@ namespace audio {
} }
bool isMasterOf(audio::orchestra::Interface& _interface); bool isMasterOf(audio::orchestra::Interface& _interface);
protected: protected:
void openRtApi(enum audio::orchestra::type _api); void openApi(const std::string& _api);
}; };
} }
} }

View File

@ -18,7 +18,7 @@ namespace audio {
public: public:
Alsa(); Alsa();
virtual ~Alsa(); virtual ~Alsa();
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
return audio::orchestra::type_alsa; return audio::orchestra::type_alsa;
} }
uint32_t getDeviceCount(); uint32_t getDeviceCount();

View File

@ -17,7 +17,7 @@ namespace audio {
public: public:
Android(); Android();
virtual ~Android(); virtual ~Android();
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
return audio::orchestra::type_java; return audio::orchestra::type_java;
} }
uint32_t getDeviceCount(); uint32_t getDeviceCount();

View File

@ -18,7 +18,7 @@ namespace audio {
public: public:
Asio(); Asio();
virtual ~Asio(); virtual ~Asio();
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
return audio::orchestra::WINDOWS_ASIO; return audio::orchestra::WINDOWS_ASIO;
} }
uint32_t getDeviceCount(); uint32_t getDeviceCount();

View File

@ -21,7 +21,7 @@ namespace audio {
public: public:
Core(); Core();
virtual ~Core(); virtual ~Core();
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
return audio::orchestra::type_coreOSX; return audio::orchestra::type_coreOSX;
} }
uint32_t getDeviceCount(); uint32_t getDeviceCount();

View File

@ -19,7 +19,7 @@ namespace audio {
public: public:
CoreIos(); CoreIos();
virtual ~CoreIos(); virtual ~CoreIos();
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
return audio::orchestra::type_coreIOS; return audio::orchestra::type_coreIOS;
} }
uint32_t getDeviceCount(); uint32_t getDeviceCount();

View File

@ -19,7 +19,7 @@ namespace audio {
public: public:
Ds(); Ds();
virtual ~Ds(); virtual ~Ds();
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
return audio::orchestra::type_ds; return audio::orchestra::type_ds;
} }
uint32_t getDeviceCount(); uint32_t getDeviceCount();

View File

@ -19,7 +19,7 @@ namespace audio {
static audio::orchestra::Api* create(); static audio::orchestra::Api* create();
public: public:
Dummy(); Dummy();
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
return audio::orchestra::type_dummy; return audio::orchestra::type_dummy;
} }
uint32_t getDeviceCount(); uint32_t getDeviceCount();

View File

@ -20,7 +20,7 @@ namespace audio {
public: public:
Jack(); Jack();
virtual ~Jack(); virtual ~Jack();
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
return audio::orchestra::type_jack; return audio::orchestra::type_jack;
} }
uint32_t getDeviceCount(); uint32_t getDeviceCount();

View File

@ -19,7 +19,7 @@ namespace audio {
public: public:
Oss(); Oss();
virtual ~Oss(); virtual ~Oss();
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
return audio::orchestra::type_oss; return audio::orchestra::type_oss;
} }
uint32_t getDeviceCount(); uint32_t getDeviceCount();

View File

@ -19,7 +19,7 @@ namespace audio {
public: public:
Pulse(); Pulse();
virtual ~Pulse(); virtual ~Pulse();
enum audio::orchestra::type getCurrentApi() { const std::string& getCurrentApi() {
return audio::orchestra::type_pulse; return audio::orchestra::type_pulse;
} }
uint32_t getDeviceCount(); uint32_t getDeviceCount();

View File

@ -15,59 +15,14 @@
#undef __class__ #undef __class__
#define __class__ "type" #define __class__ "type"
static const char* listType[] = { const std::string audio::orchestra::type_undefined = "undefined";
"undefined", const std::string audio::orchestra::type_alsa = "alsa";
"alsa", const std::string audio::orchestra::type_pulse = "pulse";
"pulse", const std::string audio::orchestra::type_oss = "oss";
"oss", const std::string audio::orchestra::type_jack = "jack";
"jack", const std::string audio::orchestra::type_coreOSX = "coreOSX";
"coreOSX", const std::string audio::orchestra::type_coreIOS = "coreIOS";
"corIOS", const std::string audio::orchestra::type_asio = "asio";
"asio", const std::string audio::orchestra::type_ds = "ds";
"ds", const std::string audio::orchestra::type_java = "java";
"java", const std::string audio::orchestra::type_dummy = "dummy";
"dummy",
"user1",
"user2",
"user3",
"user4"
};
static int32_t listTypeSize = sizeof(listType)/sizeof(char*);
std::ostream& audio::orchestra::operator <<(std::ostream& _os, const enum audio::orchestra::type& _obj) {
_os << listType[_obj];
return _os;
}
std::ostream& audio::orchestra::operator <<(std::ostream& _os, const std::vector<enum audio::orchestra::type>& _obj) {
_os << std::string("{");
for (size_t iii=0; iii<_obj.size(); ++iii) {
if (iii!=0) {
_os << std::string(";");
}
_os << _obj[iii];
}
_os << std::string("}");
return _os;
}
/*
template <enum audio::format> std::string to_string(const enum audio::format& _variable) {
return listType[_value];
}
*/
std::string audio::orchestra::getTypeString(enum audio::orchestra::type _value) {
return listType[_value];
}
enum audio::orchestra::type audio::orchestra::getTypeFromString(const std::string& _value) {
for (int32_t iii=0; iii<listTypeSize; ++iii) {
if (_value == listType[iii]) {
return static_cast<enum audio::orchestra::type>(iii);
}
}
if (_value == "auto") {
return audio::orchestra::type_undefined;
}
return audio::orchestra::type_undefined;
}

View File

@ -17,27 +17,17 @@ namespace audio {
/** /**
* @brief Audio API specifier arguments. * @brief Audio API specifier arguments.
*/ */
enum type { extern const std::string type_undefined; //!< Error API.
type_undefined, //!< Error API. extern const std::string type_alsa; //!< LINUX The Advanced Linux Sound Architecture.
type_alsa, //!< LINUX The Advanced Linux Sound Architecture. extern const std::string type_pulse; //!< LINUX The Linux PulseAudio.
type_pulse, //!< LINUX The Linux PulseAudio. extern const std::string type_oss; //!< LINUX The Linux Open Sound System.
type_oss, //!< LINUX The Linux Open Sound System. extern const std::string type_jack; //!< UNIX The Jack Low-Latency Audio Server.
type_jack, //!< UNIX The Jack Low-Latency Audio Server. extern const std::string type_coreOSX; //!< Macintosh OSX Core Audio.
type_coreOSX, //!< Macintosh OSX Core Audio. extern const std::string type_coreIOS; //!< Macintosh iOS Core Audio.
type_coreIOS, //!< Macintosh iOS Core Audio. extern const std::string type_asio; //!< WINDOWS The Steinberg Audio Stream I/O.
type_asio, //!< WINDOWS The Steinberg Audio Stream I/O. extern const std::string type_ds; //!< WINDOWS The Microsoft Direct Sound.
type_ds, //!< WINDOWS The Microsoft Direct Sound. extern const std::string type_java; //!< ANDROID Interface.
type_java, //!< ANDROID Interface. extern const std::string type_dummy; //!< Empty wrapper (non-functional).
type_dummy, //!< Empty wrapper (non-functional).
type_user1, //!< User interface 1.
type_user2, //!< User interface 2.
type_user3, //!< User interface 3.
type_user4, //!< User interface 4.
};
std::ostream& operator <<(std::ostream& _os, const enum audio::orchestra::type& _obj);
std::ostream& operator <<(std::ostream& _os, const std::vector<enum audio::orchestra::type>& _obj);
std::string getTypeString(enum audio::orchestra::type _value);
enum audio::orchestra::type getTypeFromString(const std::string& _value);
} }
} }

View File

@ -4,7 +4,7 @@ import lutin.tools as tools
import lutin.debug as debug import lutin.debug as debug
def get_desc(): def get_desc():
return "audio_orchestra : Generic wrapper on all audio interface" return "Generic wrapper on all audio interface"
def create(target): def create(target):
@ -71,7 +71,6 @@ def create(target):
myModule.add_export_path(tools.get_current_path(__file__)) myModule.add_export_path(tools.get_current_path(__file__))
# add the currrent module at the
return myModule return myModule

View File

@ -0,0 +1,19 @@
#!/usr/bin/python
import lutin.module as module
import lutin.tools as tools
import lutin.debug as debug
def get_desc():
return "'in' tool for orchestra"
def create(target):
myModule = module.Module(__file__, 'orchestra-in', 'BINARY')
myModule.add_src_file([
'orchestra-in.cpp'
])
myModule.add_module_depend(['audio_orchestra', 'test-debug'])
return myModule

View File

@ -0,0 +1,19 @@
#!/usr/bin/python
import lutin.module as module
import lutin.tools as tools
import lutin.debug as debug
def get_desc():
return "'list' i/o tool for orchestra"
def create(target):
myModule = module.Module(__file__, 'orchestra-list', 'BINARY')
myModule.add_src_file([
'orchestra-list.cpp'
])
myModule.add_module_depend(['audio_orchestra', 'test-debug'])
return myModule

View File

@ -0,0 +1,19 @@
#!/usr/bin/python
import lutin.module as module
import lutin.tools as tools
import lutin.debug as debug
def get_desc():
return "'out' tool for orchestra"
def create(target):
myModule = module.Module(__file__, 'orchestra-out', 'BINARY')
myModule.add_src_file([
'orchestra-out.cpp'
])
myModule.add_module_depend(['audio_orchestra', 'test-debug'])
return myModule

0
tools/orchestra-in.cpp Normal file
View File

39
tools/orchestra-list.cpp Normal file
View File

@ -0,0 +1,39 @@
/** @file
* @author Edouard DUPIN
* @copyright 2015, Edouard DUPIN, all right reserved
* @license APACHE v2.0 (see license file)
*/
#include <etk/etk.h>
#include <test-debug/debug.h>
#include <unistd.h>
#include <audio/orchestra/Interface.h>
int main(int _argc, const char **_argv) {
// the only one init for etk:
etk::init(_argc, _argv);
for (int32_t iii=0; iii<_argc ; ++iii) {
std::string data = _argv[iii];
if ( data == "-h"
|| data == "--help") {
std::cout << "Help : " << std::endl;
std::cout << " ./xxx ---" << std::endl;
exit(0);
}
}
audio::orchestra::Interface interface;
std::vector<std::string> apis = interface.getListApi();
TEST_PRINT("Find : " << apis.size() << " apis.");
for (auto &it : apis) {
interface.instanciate(it);
TEST_PRINT("Device list for : '" << it << "'");
for (int32_t iii=0; iii<interface.getDeviceCount(); ++iii) {
audio::orchestra::DeviceInfo info = interface.getDeviceInfo(iii);
TEST_PRINT(" " << iii << " name :" << info.name);
info.display(2);
}
interface.clear();
}
return 0;
}

0
tools/orchestra-out.cpp Normal file
View File