namespace FreeDV {
// Global instance of the driver manager used to register
// drivers and to create driver instances.
- DriverManager driver_manager;
DriverManager::DriverManager()
{
{
}
+ void
+ DriverManager::print(ostream & s)
+ {
+ s << "AudioInput: ";
+ for (auto i = audio_input_drivers.begin(); i != audio_input_drivers.end(); i++ )
+ s << i->first << " ";
+ s << endl;
+ s << "AudioOutput: ";
+ for (auto i = audio_output_drivers.begin(); i != audio_output_drivers.end(); i++ )
+ s << i->first << " ";
+ s << endl;
+ s << "Keying: ";
+ for (auto i = keying_drivers.begin(); i != keying_drivers.end(); i++ )
+ s << i->first << " ";
+ s << endl;
+ s << "TextInput: ";
+ for (auto i = text_input_drivers.begin(); i != text_input_drivers.end(); i++ )
+ s << i->first << " ";
+ s << endl;
+ s << "PTTInput: ";
+ for (auto i = ptt_input_drivers.begin(); i != ptt_input_drivers.end(); i++ )
+ s << i->first << " ";
+ s << endl;
+ s << "UserInterface: ";
+ for (auto i = user_interface_drivers.begin(); i != user_interface_drivers.end(); i++ )
+ s << i->first << " ";
+ s << endl;
+ }
+
AudioInput *
DriverManager::audio_input(const char * driver, const char * parameter)
{
- return 0;
+ AudioInput * (* const creator)(const char * parameter) = audio_input_drivers[driver];
+
+ if(creator)
+ return creator(parameter);
+ else
+ return 0;
}
AudioOutput *
DriverManager::audio_output(const char * driver, const char * parameter)
{
- return 0;
}
Keying *
DriverManager::keying(const char * driver, const char * parameter)
{
- return 0;
+ Keying * (* const creator)(const char * parameter) = keying_drivers[driver];
+
+ if(creator)
+ return creator(parameter);
+ else
+ return 0;
}
PTTInput *
DriverManager::ptt_input(const char * driver, const char * parameter)
{
- return 0;
+ PTTInput * (* const creator)(const char * parameter) = ptt_input_drivers[driver];
+
+ if(creator)
+ return creator(parameter);
+ else
+ return 0;
}
TextInput *
DriverManager::text_input(const char * driver, const char * parameter)
{
- return 0;
+ TextInput * (* const creator)(const char * parameter) = text_input_drivers[driver];
+
+ if(creator)
+ return creator(parameter);
+ else
+ return 0;
}
UserInterface *
DriverManager::user_interface(const char * driver, const char * parameter)
{
- return 0;
+ UserInterface * (* const creator)(const char * parameter) = user_interface_drivers[driver];
+
+ if(creator)
+ return creator(parameter);
+ else
+ return 0;
}
void
DriverManager::register_audio_input(const char * driver, AudioInput * (*creator)(const char *))
{
- clog << "Registered audio input driver \"" << driver << "\"." << endl;
+ audio_input_drivers[driver] = creator;
}
void
DriverManager::register_audio_output(const char * driver, AudioOutput * (*creator)(const char *))
{
- clog << "Registered audio output driver \"" << driver << "\"." << endl;
+ audio_output_drivers[driver] = creator;
}
void
DriverManager::register_keying(const char * driver, Keying * (*creator)(const char *))
{
- clog << "Registered keying driver \"" << driver << "\"." << endl;
+ keying_drivers[driver] = creator;
}
void
DriverManager::register_ptt_input(const char * driver, PTTInput * (*creator)(const char *))
{
- clog << "Registered PTT driver \"" << driver << "\"." << endl;
+ ptt_input_drivers[driver] = creator;
}
void
DriverManager::register_text_input(const char * driver, TextInput * (*creator)(const char *))
{
- clog << "Registered text input driver \"" << driver << "\"." << endl;
+ text_input_drivers[driver] = creator;
}
void
DriverManager::register_user_interface(const char * driver, UserInterface * (*creator)(const char *))
{
- clog << "Registered user interface driver \"" << driver << "\"." << endl;
+ user_interface_drivers[driver] = creator;
+ }
+
+ // This has to be a function to get around the static initalization order problem.
+ DriverManager &
+ init_driver_manager()
+ {
+ static DriverManager manager;
+ return manager;
}
-};
+
+ DriverManager & driver_manager = init_driver_manager();
+}
*/
#include <stdlib.h>
+#include <iostream>
+#include <map>
+#include <string>
+
namespace FreeDV {
class AudioInput {
virtual PTTInput * ptt_input();
};
+ class Interfaces {
+ public:
+ Interfaces() : user_interface(0), keying(0), loudspeaker(0), microphone(0),
+ ptt(0), receiver(0), text(0), transmitter(0), mode(0)
+ {
+ }
+
+ UserInterface * user_interface;
+ Keying * keying;
+ AudioOutput * loudspeaker;
+ AudioInput * microphone;
+ PTTInput * ptt;
+ AudioInput * receiver;
+ TextInput * text;
+ AudioOutput * transmitter;
+ const char * mode;
+ };
+
class DriverManager {
+ private:
+ std::map<std::string, AudioInput *(*)(const char *)> audio_input_drivers;
+ std::map<std::string, AudioOutput *(*)(const char *)> audio_output_drivers;
+ std::map<std::string, Keying *(*)(const char *)> keying_drivers;
+ std::map<std::string, PTTInput *(*)(const char *)> ptt_input_drivers;
+ std::map<std::string, TextInput *(*)(const char *)> text_input_drivers;
+ std::map<std::string, UserInterface *(*)(const char *)> user_interface_drivers;
public:
DriverManager();
~DriverManager();
+ void print(std::ostream &);
+
AudioInput * audio_input(const char * driver, const char * parameter);
AudioOutput * audio_output(const char * driver, const char * parameter);
Keying * keying(const char * driver, const char * parameter);
void register_user_interface(const char * driver, UserInterface * (*creator)(const char *));
};
- extern DriverManager driver_manager;
-};
+ extern DriverManager & driver_manager;
+ // This version has to be called from static initializers.
+ extern DriverManager & init_driver_manager();
+}
#include "drivers.h"
using namespace std;
+namespace FreeDV {
+ extern int run(struct Interfaces *);
+}
using namespace FreeDV;
+
static void drivers()
{
- cout << "To be implemented." << endl;
+ driver_manager.print(cout);
}
static void help(const char * name)
cerr << "\nUsage: " << name << message << endl;
}
-struct parameters {
- const char * * interface;
- const char * * keying;
- const char * * loudspeaker;
- const char * * microphone;
- const char * mode;
- const char * * ptt;
- const char * * receiver;
- const char * * text;
- const char * * transmitter;
+static const struct option options[] = {
+ { "drivers", no_argument, 0, 'd' },
+ { "help", no_argument, 0, 'h' },
+ { "interface", required_argument, 0, 'i' },
+ { "keying", required_argument, 0, 'k' },
+ { "loudspeaker", required_argument, 0, 'l' },
+ { "microphone", required_argument, 0, 'm' },
+ { "mode", required_argument, 0, 'n' },
+ { "ptt", required_argument, 0, 'p' },
+ { "receiver", required_argument, 0, 'r' },
+ { "text", required_argument, 0, 'x' },
+ { "transmitter", required_argument, 0, 't' },
+ { 0, 0, 0, 0 }
};
-struct interfaces {
- UserInterface * interface;
- Keying * keying;
- AudioOutput * loudspeaker;
- AudioInput * microphone;
- PTTInput * ptt;
- AudioInput * receiver;
- TextInput * text;
- AudioOutput * transmitter;
-};
-
-static int run(struct parameters * p)
-{
- return 0;
-}
-
int
main(int argc, char * * argv)
{
- int command;
- struct parameters p = { 0,0,0,0,0,0,0,0,0 };
-
- static const struct option options[] = {
- { "drivers", no_argument, 0, 'd' },
- { "help", no_argument, 0, 'h' },
- { "interface", required_argument, 0, 'i' },
- { "keying", required_argument, 0, 'k' },
- { "loudspeaker", required_argument, 0, 'l' },
- { "microphone", required_argument, 0, 'm' },
- { "mode", required_argument, 0, 'n' },
- { "ptt", required_argument, 0, 'p' },
- { "receiver", required_argument, 0, 'r' },
- { "text", required_argument, 0, 'x' },
- { "transmitter", required_argument, 0, 't' },
- { 0, 0, 0, 0 }
- };
+ int command;
+ Interfaces i;
+ const char * driver;
+ const char * parameter;
if ( argc > 1 ) {
- const char * * vector(new const char *[2]);
-
while ((command = getopt_long(argc, argv, "dhi:k:l:m:n:p:r:t:x:", options, NULL)) != -1) {
switch (command) {
case 'i':
}
*colon = 0;
- vector[0] = optarg;
- vector[1] = &colon[1];
+ driver = optarg;
+ parameter = &colon[1];
}
switch (command) {
exit(1);
break;
case 'i':
- p.interface = vector;
+ i.user_interface = driver_manager.user_interface(driver, parameter);
break;
case 'k':
- p.keying = vector;
+ i.keying = driver_manager.keying(driver, parameter);
break;
case 'l':
- p.loudspeaker = vector;
+ i.loudspeaker = driver_manager.audio_output(driver, parameter);
break;
case 'm':
- p.microphone = vector;
+ i.microphone = driver_manager.audio_input(driver, parameter);
break;
case 'n':
- p.mode = optarg;
+ i.mode = optarg;
break;
case 'p':
- p.ptt = vector;
+ i.ptt = driver_manager.ptt_input(driver, parameter);
break;
case 'r':
- p.receiver = vector;
+ i.receiver = driver_manager.audio_input(driver, parameter);
break;
case 't':
- p.transmitter = vector;
+ i.transmitter = driver_manager.audio_output(driver, parameter);
break;
case 'x':
- p.text = vector;
+ i.text = driver_manager.text_input(driver, parameter);
break;
case 0:
break;
help(argv[0]);
exit(1);
}
- run(&p);
- return 0;
+ return run(&i);
}