From c37626ccfe3b6b8ef29c2122c616052d042f8016 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Sat, 12 Nov 2022 00:02:51 +0100 Subject: Add AudioAPI and some related methods. --- src/wx/audio_api.cc | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/wx/audio_api.h | 71 +++++++++++++++++++++++++++++++++++++ src/wx/wscript | 1 + 3 files changed, 172 insertions(+) create mode 100644 src/wx/audio_api.cc create mode 100644 src/wx/audio_api.h diff --git a/src/wx/audio_api.cc b/src/wx/audio_api.cc new file mode 100644 index 000000000..7c2c94b51 --- /dev/null +++ b/src/wx/audio_api.cc @@ -0,0 +1,100 @@ +/* + Copyright (C) 2022 Carl Hetherington + + 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 . + +*/ + + +#include "audio_api.h" +#include "lib/dcpomatic_assert.h" +#include +#include + + +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 +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 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(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 index 000000000..3231d1d24 --- /dev/null +++ b/src/wx/audio_api.h @@ -0,0 +1,71 @@ +/* + Copyright (C) 2022 Carl Hetherington + + 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 . + +*/ + + +#ifndef DCPOMATIC_AUDIO_API_H +#define DCPOMATIC_AUDIO_API_H + + +#include +#include +LIBDCP_DISABLE_WARNINGS +#include +LIBDCP_ENABLE_WARNINGS +#include +#include + + +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 audio_apis(); +AudioAPI id_to_audio_api(std::string id); +AudioAPI id_to_audio_api(boost::optional id); +AudioAPI rtaudio_id_to_audio_api(RtAudio::Api api); +AudioAPI index_to_audio_api(int index); + + +#endif + diff --git a/src/wx/wscript b/src/wx/wscript index ba51aec57..d4e25950c 100644 --- a/src/wx/wscript +++ b/src/wx/wscript @@ -26,6 +26,7 @@ import i18n sources = """ about_dialog.cc + audio_api.cc audio_dialog.cc audio_gain_dialog.cc audio_mapping_view.cc -- cgit v1.2.3