Add AudioAPI and some related methods.
authorCarl Hetherington <cth@carlh.net>
Fri, 11 Nov 2022 23:02:51 +0000 (00:02 +0100)
committerCarl Hetherington <cth@carlh.net>
Sat, 12 Nov 2022 23:12:26 +0000 (00:12 +0100)
src/wx/audio_api.cc [new file with mode: 0644]
src/wx/audio_api.h [new file with mode: 0644]
src/wx/wscript

diff --git a/src/wx/audio_api.cc b/src/wx/audio_api.cc
new file mode 100644 (file)
index 0000000..7c2c94b
--- /dev/null
@@ -0,0 +1,100 @@
+/*
+    Copyright (C) 2022 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#include "audio_api.h"
+#include "lib/dcpomatic_assert.h"
+#include <boost/optional.hpp>
+#include <vector>
+
+
+using std::string;
+using std::vector;
+using boost::optional;
+
+
+static AudioAPI wasapi(_("WASAPI"), "wasapi", RtAudio::WINDOWS_WASAPI);
+static AudioAPI asio(_("ASIO"), "asio", RtAudio::WINDOWS_ASIO);
+static AudioAPI pulse(_("PulseAudio"), "pulse", RtAudio::LINUX_PULSE);
+static AudioAPI alsa(_("ALSA"), "alsa", RtAudio::LINUX_ALSA);
+static AudioAPI core(_("CoreAudio"), "core", RtAudio::MACOSX_CORE);
+
+
+vector<AudioAPI>
+audio_apis()
+{
+#ifdef DCPOMATIC_WINDOWS
+       return { wasapi, asio };
+       };
+#endif
+#ifdef DCPOMATIC_LINUX
+       return { pulse, alsa };
+#endif
+#ifdef DCPOMATIC_OSX
+       return { core };
+#endif
+}
+
+
+AudioAPI
+id_to_audio_api(string id)
+{
+       const auto apis = audio_apis();
+       auto iter = std::find_if(apis.begin(), apis.end(), [&id](AudioAPI const& api) { return api.id() == id; });
+       if (iter == apis.end()) {
+               return apis[0];
+       }
+
+       return *iter;
+}
+
+
+AudioAPI
+rtaudio_id_to_audio_api(RtAudio::Api id)
+{
+       const auto apis = audio_apis();
+       auto iter = std::find_if(apis.begin(), apis.end(), [&id](AudioAPI const& api) { return api.rtaudio_id() == id; });
+       DCPOMATIC_ASSERT(iter != apis.end());
+       return *iter;
+}
+
+AudioAPI
+id_to_audio_api(optional<string> id)
+{
+       const auto apis = audio_apis();
+       if (!id) {
+               return apis[0];
+       }
+
+       return id_to_audio_api(*id);
+}
+
+
+AudioAPI
+index_to_audio_api(int index)
+{
+       const auto apis = audio_apis();
+       if (index < 0 || index >= static_cast<int>(apis.size())) {
+               return apis[0];
+       }
+
+       return apis[index];
+}
+
diff --git a/src/wx/audio_api.h b/src/wx/audio_api.h
new file mode 100644 (file)
index 0000000..3231d1d
--- /dev/null
@@ -0,0 +1,71 @@
+/*
+    Copyright (C) 2022 Carl Hetherington <cth@carlh.net>
+
+    This file is part of DCP-o-matic.
+
+    DCP-o-matic is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    DCP-o-matic is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with DCP-o-matic.  If not, see <http://www.gnu.org/licenses/>.
+
+*/
+
+
+#ifndef DCPOMATIC_AUDIO_API_H
+#define DCPOMATIC_AUDIO_API_H
+
+
+#include <dcp/warnings.h>
+#include <wx/wx.h>
+LIBDCP_DISABLE_WARNINGS
+#include <RtAudio.h>
+LIBDCP_ENABLE_WARNINGS
+#include <boost/optional.hpp>
+#include <string>
+
+
+class AudioAPI
+{
+public:
+       AudioAPI(wxString name, std::string id, RtAudio::Api rtaudio_id)
+               : _name(name)
+               , _id(id)
+               , _rtaudio_id(rtaudio_id)
+       {}
+
+       wxString name() const {
+               return _name;
+       }
+
+       std::string id() const {
+               return _id;
+       }
+
+       RtAudio::Api rtaudio_id() const {
+               return _rtaudio_id;
+       }
+
+private:
+       wxString _name;
+       std::string _id;
+       RtAudio::Api _rtaudio_id;
+};
+
+
+std::vector<AudioAPI> audio_apis();
+AudioAPI id_to_audio_api(std::string id);
+AudioAPI id_to_audio_api(boost::optional<std::string> id);
+AudioAPI rtaudio_id_to_audio_api(RtAudio::Api api);
+AudioAPI index_to_audio_api(int index);
+
+
+#endif
+
index ba51aec571db9cf905cad55675a05daaa6c32835..d4e25950cd0b7be225d66a9d338ded072ba474ce 100644 (file)
@@ -26,6 +26,7 @@ import i18n
 
 sources = """
           about_dialog.cc
+          audio_api.cc
           audio_dialog.cc
           audio_gain_dialog.cc
           audio_mapping_view.cc