Skip to content

Commit

Permalink
GOMidiPortsFactory started inheritance from GOPortFactory GrandOrgue#703
Browse files Browse the repository at this point in the history
  • Loading branch information
Oleg Samarin committed Dec 4, 2021
1 parent 28ab068 commit 4ba136a
Show file tree
Hide file tree
Showing 5 changed files with 86 additions and 12 deletions.
51 changes: 48 additions & 3 deletions src/grandorgue/midi/ports/GOMidiPortFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,58 @@
*/

#include "GOMidiPortFactory.h"
#include "GOMidiRtPortFactory.h"

static bool hasPortsPopulated = false;
static std::vector<wxString> portNames;

const std::vector<wxString>& GOMidiPortFactory::GetPortNames() const
{
if (! hasPortsPopulated)
{
portNames.push_back(GOMidiRtPortFactory::PORT_NAME);
hasPortsPopulated = true;
}
return portNames;
}

const std::vector<wxString>& GOMidiPortFactory::GetPortApiNames(const wxString & portName)
const
{
if (portName == GOMidiRtPortFactory::PORT_NAME)
return GOMidiRtPortFactory::getApis();
else // old-style name
return c_NoApis;
}

static GOMidiPortFactory instance;

GOMidiPortFactory& GOMidiPortFactory::getInstance() { return instance; }

static GOMidiRtPortFactory* p_rt_factory = NULL;

GOMidiRtPortFactory* get_rt()
{
if (! p_rt_factory)
p_rt_factory = new GOMidiRtPortFactory();
return p_rt_factory;
}

void GOMidiPortFactory::addMissingInDevices(GOMidi* midi, ptr_vector<GOMidiInPort>& ports)
{
m_RtFactory.addMissingInDevices(midi, ports);
get_rt() -> addMissingInDevices(midi, ports);
}

void GOMidiPortFactory::addMissingOutDevices(GOMidi* midi, ptr_vector<GOMidiOutPort>& ports)
{
m_RtFactory.addMissingOutDevices(midi, ports);
}
get_rt() -> addMissingOutDevices(midi, ports);
}

void GOMidiPortFactory::terminate()
{
if (p_rt_factory)
{
delete p_rt_factory;
p_rt_factory = NULL;
}
}
20 changes: 12 additions & 8 deletions src/grandorgue/midi/ports/GOMidiPortFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -9,20 +9,24 @@

#include <ptrvector.h>

#include "settings/GOPortFactory.h"

#include "GOMidiInPort.h"
#include "GOMidiOutPort.h"
#include "GOMidiRtPortFactory.h"

class GOMidi;

class GOMidiPortFactory {
private:
GOMidiRtPortFactory m_RtFactory;

class GOMidiPortFactory: public GOPortFactory
{
public:
void addMissingInDevices(GOMidi* midi, ptr_vector<GOMidiInPort>& ports);
void addMissingOutDevices(GOMidi* midi, ptr_vector<GOMidiOutPort>& ports);
virtual const std::vector<wxString>& GetPortNames() const;
virtual const std::vector<wxString>& GetPortApiNames(const wxString & portName) const;

static GOMidiPortFactory& getInstance();
static void addMissingInDevices(GOMidi* midi, ptr_vector<GOMidiInPort>& ports);
static void addMissingOutDevices(GOMidi* midi, ptr_vector<GOMidiOutPort>& ports);
static void terminate();
};

#endif /* GOMIDIFACTORY_H */
#endif /* GOMIDIPORTFACTORY_H */

20 changes: 20 additions & 0 deletions src/grandorgue/midi/ports/GOMidiRtPortFactory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@
#include <wx/intl.h>
#include <wx/log.h>

const wxString GOMidiRtPortFactory::PORT_NAME = wxT("Rt");

static std::vector<RtMidi::Api> apis;
static bool hasApisPopulated = false;

Expand Down Expand Up @@ -114,3 +116,21 @@ void GOMidiRtPortFactory::addMissingOutDevices(GOMidi* midi, ptr_vector<GOMidiOu
wxLogError(_("RtMidi error: %s"), error.c_str());
}
}

static bool hasApiNamesPopulated = false;
static std::vector<wxString> apiNames;

const std::vector<wxString> & GOMidiRtPortFactory::getApis()
{
if (! hasApiNamesPopulated)
{
std::vector<RtMidi::Api> apiIndices;
RtMidi::getCompiledApi(apiIndices);

for (unsigned k = 0; k < apiIndices.size(); k++) {
apiNames.push_back(wxString(RtMidi::getApiName(apiIndices[k])));
}
hasApiNamesPopulated = true;
}
return apiNames;
}
6 changes: 5 additions & 1 deletion src/grandorgue/midi/ports/GOMidiRtPortFactory.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,15 @@ class GOMidiRtPortFactory {
std::map<RtMidi::Api, RtMidiOut*> m_RtMidiOuts;

public:
static const wxString PORT_NAME;

GOMidiRtPortFactory();
~GOMidiRtPortFactory();

void addMissingInDevices(GOMidi* midi, ptr_vector<GOMidiInPort>& ports);
void addMissingOutDevices(GOMidi* midi, ptr_vector<GOMidiOutPort>& ports);

static const std::vector<wxString> & getApis();
};

#endif /* GOMIDIRTFACTORY_H */
#endif /* GOMIDIRTPORTFACTORY_H */
1 change: 1 addition & 0 deletions src/grandorgue/sound/GOSound.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ GOSound::~GOSound()

CloseSound();

GOMidiPortFactory::terminate();
GOSoundPortFactory::terminate();
}

Expand Down

0 comments on commit 4ba136a

Please sign in to comment.