• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

ossia / score / 30507431705

30 Jul 2026 02:04AM UTC coverage: 15.263% (-0.06%) from 15.321%
30507431705

push

github

jcelerier
audio: simplify pretty name for Default device

0 of 2 new or added lines in 1 file covered. (0.0%)

1386 existing lines in 18 files now uncovered.

30460 of 199565 relevant lines covered (15.26%)

1075.35 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

50.56
/src/plugins/score-plugin-audio/Audio/Settings/Model.cpp
1
#include <Audio/DummyInterface.hpp>
2
#include <Audio/Settings/Model.hpp>
3

4
#include <score/application/GUIApplicationContext.hpp>
5

6
#include <optional>
7
namespace Audio::Settings
8
{
9
namespace Parameters
10
{
11
// portaudio is the default
12
SETTINGS_PARAMETER_IMPL(Driver)
37✔
13
{
37✔
14
  QStringLiteral("Audio/Driver"),
37✔
15
#if defined(_WIN32)
16
      Audio::AudioFactory::ConcreteKey{score::uuids::string_generator::compute(
17
          "2838b52b-9c0c-466e-a2b0-8c6d8cb8fc6d")} // WASAPI (miniaudio)
18
#elif defined(__APPLE__)
19
    Audio::AudioFactory::ConcreteKey{
20
        score::uuids::string_generator::compute("85115103-694a-4a3b-9274-76ef47aec5a9")}
21
#elif defined(__linux__)
22
      Audio::AudioFactory::ConcreteKey{score::uuids::string_generator::compute(
37✔
23
          "687d49cf-b58d-430f-8358-ec02cb50be36")} // PipeWire
24
#elif defined(__EMSCRIPTEN__)
25
      Audio::AudioFactory::ConcreteKey{score::uuids::string_generator::compute(
26
          "a2e8b688-521c-4755-b0b2-4e3d01807b8e")} // Web Audio (MiniAudio)
27
#else
28
      Audio::AudioFactory::ConcreteKey
29
  {
30
    score::uuids::string_generator::compute("e7543875-3b22-457c-bf41-75504637686f")
31
  }
32
#endif
33
};
34
SETTINGS_PARAMETER_IMPL(InputNames){QStringLiteral("Audio/InputNames"), {}};
37✔
35
SETTINGS_PARAMETER_IMPL(OutputNames){QStringLiteral("Audio/OutputNames"), {}};
37✔
36
SETTINGS_PARAMETER_IMPL(CardIn){QStringLiteral("Audio/CardIn"), ""};
37✔
37
SETTINGS_PARAMETER_IMPL(CardOut){QStringLiteral("Audio/CardOut"), ""};
37✔
38
SETTINGS_PARAMETER_IMPL(BufferSize){QStringLiteral("Audio/BufferSize"), 512};
37✔
39
SETTINGS_PARAMETER_IMPL(Rate){QStringLiteral("Audio/SamplingRate"), 44100};
37✔
40
SETTINGS_PARAMETER_IMPL(DefaultIn){QStringLiteral("Audio/DefaultIn"), 2};
37✔
41
SETTINGS_PARAMETER_IMPL(DefaultOut){QStringLiteral("Audio/DefaultOut"), 2};
37✔
42
SETTINGS_PARAMETER_IMPL(AutoStereo){QStringLiteral("Audio/AutoStereo"), true};
37✔
43
SETTINGS_PARAMETER_IMPL(AutoConnect){QStringLiteral("Audio/AutoConnect"), true};
37✔
44
SETTINGS_PARAMETER_IMPL(JackTransport){
37✔
45
    QStringLiteral("Audio/JackTransport"), ExternalTransport::None};
37✔
46

47
static auto list()
39✔
48
{
49
  return std::tie(
39✔
50
      Rate, InputNames, OutputNames, CardIn, CardOut, BufferSize, DefaultIn, DefaultOut,
51
      AutoStereo, AutoConnect, JackTransport, Driver);
52
}
53
}
54

55
// Maps the SCORE_AUDIO_BACKEND environment variable to a concrete driver key.
56
// Used both at startup (so headless/CI/test runs can force a backend such as
57
// "dummy") and from the settings GUI. Returns std::nullopt when the variable is
58
// unset or unrecognized.
59
static std::optional<Audio::AudioFactory::ConcreteKey> driverFromEnv()
78✔
60
{
61
  auto env = qEnvironmentVariable("SCORE_AUDIO_BACKEND").toLower();
78✔
62
  if(env.isEmpty())
78✔
63
    return std::nullopt;
×
64

65
  QByteArray uid;
78✔
66
  if(env == "dummy")
78✔
67
    uid = "13dabcc3-9cda-422f-a8c7-5fef5c220677";
78✔
68
  else if(env == "jack")
×
69
    uid = "7ff2af00-f2f5-4930-beec-0e2d21eda195";
×
70
  else if(env == "sdl")
×
71
    uid = "28b88e91-c5f0-4f13-834f-aa333d14aa81";
×
72
  else if(env == "pipewire")
×
73
    uid = "687d49cf-b58d-430f-8358-ec02cb50be36";
×
74
  else if(env == "coreaudio")
×
75
    uid = "85115103-694a-4a3b-9274-76ef47aec5a9";
×
76
  else if(env == "alsa")
×
77
    uid = "a390218a-a951-4cda-b4ee-c41d2df44236";
×
78
  else if(env == "alsa_portaudio")
×
79
    uid = "3533ee88-9a8d-486c-b20b-6c966cf4eaa0";
×
80
  else if(env == "alsa_miniaudio")
×
81
    uid = "e0c533da-a1f4-4795-90b5-a805cdfcb79f";
×
UNCOV
82
  else if(env == "wasapi_miniaudio")
×
UNCOV
83
    uid = "2838b52b-9c0c-466e-a2b0-8c6d8cb8fc6d";
×
84

85
  if(uid.isEmpty())
78✔
UNCOV
86
    return std::nullopt;
×
87

88
  const char* data = uid.data();
78✔
89
  using uid_t = const char(&)[37];
90
  return Audio::AudioFactory::ConcreteKey{
78✔
91
      score::uuids::string_generator::compute((uid_t)*data)};
78✔
92
}
78✔
93

94
Model::Model(
39✔
95
    const UuidKey<score::SettingsDelegateFactory>& k, QSettings& set,
96
    const score::ApplicationContext& ctx)
97
    : score::SettingsDelegateModel{k, nullptr}
39✔
98
{
39✔
99
  score::setupDefaultSettings(set, Parameters::list(), *this);
39✔
100
  using namespace std::literals;
101
  if(m_Driver
78✔
102
     == Audio::AudioFactory::ConcreteKey::fromString(
39✔
103
         "85115103-694a-4a3b-9274-76ef47aec5a9"s))
39✔
104
  {
UNCOV
105
    m_Driver = Parameters::Driver.def;
×
UNCOV
106
  }
×
107

108
  // Allow forcing the audio backend at startup, e.g. SCORE_AUDIO_BACKEND=dummy
109
  // for headless / CI / test runs.
110
  if(auto k = driverFromEnv())
39✔
111
    m_Driver = *k;
39✔
UNCOV
112
}
×
113

114
Audio::AudioFactory::ConcreteKey Model::getDriver() const
98✔
115
{
116
  return m_Driver;
98✔
117
}
118

119
void Model::initDriver(Audio::AudioFactory::ConcreteKey val)
39✔
120
{
121
  if(auto k = driverFromEnv())
39✔
122
    val = *k;
39✔
123

124
  // Reset to default in case of invalid parameters.
125
  auto& ctx = score::AppContext();
39✔
126
  auto& factories = ctx.interfaces<AudioFactoryList>();
39✔
127
  auto iface = factories.get(val);
39✔
128
  if(!iface)
39✔
129
  {
130
    val = Parameters::Driver.def;
×
UNCOV
131
    iface = factories.get(val);
×
132
    if(!iface)
×
133
    {
134
      val = DummyFactory::static_concreteKey();
×
135
      iface = factories.get(val);
×
UNCOV
136
    }
×
UNCOV
137
  }
×
138

139
  if(val == m_Driver)
39✔
UNCOV
140
    return;
×
141

142
  m_Driver = val;
39✔
143

144
  // SDL
145
  if(m_Driver
78✔
146
     == Audio::AudioFactory::ConcreteKey{score::uuids::string_generator::compute(
39✔
147
         "28b88e91-c5f0-4f13-834f-aa333d14aa81")})
148
  {
149
    if(m_Rate != 48000)
×
150
    {
151
      m_Rate = 48000;
×
152
      RateChanged(m_Rate);
×
UNCOV
153
    }
×
154
    if(m_BufferSize != 1024)
×
155
    {
156
      m_BufferSize = 1024;
×
157
      BufferSizeChanged(m_BufferSize);
×
UNCOV
158
    }
×
UNCOV
159
  }
×
160

161
#if !defined(__EMSCRIPTEN__)
162
  // Special case for dummy driver: set reasonable values
163
  if(m_Driver
78✔
164
     == Audio::AudioFactory::ConcreteKey{score::uuids::string_generator::compute(
39✔
165
         "13dabcc3-9cda-422f-a8c7-5fef5c220677")})
166
  {
167
    if(m_Rate < 1 || m_Rate > 48 * 384000)
39✔
168
    {
169
      m_Rate = 44100;
×
UNCOV
170
      RateChanged(m_Rate);
×
UNCOV
171
    }
×
172
    if(m_BufferSize < 1 || m_BufferSize > 32768 * 8)
39✔
173
    {
174
      m_BufferSize = 128;
×
UNCOV
175
      BufferSizeChanged(m_BufferSize);
×
UNCOV
176
    }
×
177
  }
39✔
178
#endif
179
  iface->initialize(*this, ctx);
39✔
180
}
39✔
UNCOV
181
void Model::setDriver(Audio::AudioFactory::ConcreteKey val)
×
182
{
183
  // Reset to default in case of invalid parameters.
184
  auto& ctx = score::AppContext();
×
185
  auto& factories = ctx.interfaces<AudioFactoryList>();
×
UNCOV
186
  auto iface = factories.get(val);
×
187
  if(!iface)
×
188
  {
189
    val = Parameters::Driver.def;
×
UNCOV
190
    iface = factories.get(val);
×
191
    if(!iface)
×
192
    {
193
      val = DummyFactory::static_concreteKey();
×
194
      iface = factories.get(val);
×
UNCOV
195
    }
×
196
  }
×
197

UNCOV
198
  if(val == m_Driver)
×
199
    return;
×
200

UNCOV
201
  m_Driver = val;
×
202

203
  // SDL
UNCOV
204
  if(m_Driver
×
UNCOV
205
     == Audio::AudioFactory::ConcreteKey{score::uuids::string_generator::compute(
×
206
         "28b88e91-c5f0-4f13-834f-aa333d14aa81")})
207
  {
208
    setRate(48000);
×
UNCOV
209
    setBufferSize(1024);
×
UNCOV
210
  }
×
211

212
#if !defined(__EMSCRIPTEN__)
UNCOV
213
  QSettings s;
×
UNCOV
214
  s.setValue(Parameters::Driver.key, QVariant::fromValue(m_Driver));
×
215

216
  // Special case for dummy driver: set reasonable values
UNCOV
217
  if(m_Driver
×
UNCOV
218
     == Audio::AudioFactory::ConcreteKey{score::uuids::string_generator::compute(
×
219
         "13dabcc3-9cda-422f-a8c7-5fef5c220677")})
220
  {
UNCOV
221
    m_Rate = 44100;
×
222
    s.setValue(Parameters::Rate.key, QVariant::fromValue(m_Rate));
×
223

224
    m_BufferSize = 1024;
×
UNCOV
225
    s.setValue(Parameters::BufferSize.key, QVariant::fromValue(m_BufferSize));
×
226
  }
×
227
#endif
UNCOV
228
  iface->initialize(*this, ctx);
×
UNCOV
229
}
×
230

231
int Model::getRate() const
164✔
232
{
233
  return m_Rate;
164✔
234
}
235

236
void Model::initRate(int val)
39✔
237
{
238
  if(val <= 0)
39✔
239
    val = 44100;
×
240
  if(val == m_Rate)
39✔
UNCOV
241
    return;
×
242

243
  m_Rate = val;
39✔
244
}
39✔
245

246
void Model::setRate(int val)
20✔
247
{
248
  if(val <= 0)
20✔
UNCOV
249
    val = 44100;
×
250
  if(val == m_Rate)
20✔
251
    return;
20✔
252

UNCOV
253
  m_Rate = val;
×
254

255
#if !defined(__EMSCRIPTEN__)
UNCOV
256
  QSettings s;
×
257
  s.setValue(Parameters::Rate.key, QVariant::fromValue(m_Rate));
×
258
#endif
UNCOV
259
  RateChanged(val);
×
260
}
20✔
261

262
int Model::getBufferSize() const
60✔
263
{
264
  return m_BufferSize;
60✔
265
}
266

267
void Model::initBufferSize(int val)
39✔
268
{
269
  if(val <= 0)
39✔
270
    val = 512;
×
271
  if(val == m_BufferSize)
39✔
UNCOV
272
    return;
×
273

274
  m_BufferSize = val;
39✔
275
}
39✔
276

277
void Model::setBufferSize(int val)
20✔
278
{
279
  if(val <= 0)
20✔
UNCOV
280
    val = 512;
×
281
  if(val == m_BufferSize)
20✔
282
    return;
20✔
283

UNCOV
284
  m_BufferSize = val;
×
285

286
#if !defined(__EMSCRIPTEN__)
UNCOV
287
  QSettings s;
×
288
  s.setValue(Parameters::BufferSize.key, QVariant::fromValue(m_BufferSize));
×
289
#endif
UNCOV
290
  BufferSizeChanged(val);
×
291
}
20✔
292

293
SCORE_SETTINGS_PARAMETER_CPP(QStringList, Model, InputNames)
39✔
294
SCORE_SETTINGS_PARAMETER_CPP(QStringList, Model, OutputNames)
39✔
295
SCORE_SETTINGS_PARAMETER_CPP(QString, Model, CardIn)
39✔
296
SCORE_SETTINGS_PARAMETER_CPP(QString, Model, CardOut)
39✔
297
SCORE_SETTINGS_PARAMETER_CPP(int, Model, DefaultIn)
39✔
298
SCORE_SETTINGS_PARAMETER_CPP(int, Model, DefaultOut)
39✔
299
SCORE_SETTINGS_PARAMETER_CPP(bool, Model, AutoStereo)
39✔
300
SCORE_SETTINGS_PARAMETER_CPP(bool, Model, AutoConnect)
39✔
301
SCORE_SETTINGS_PARAMETER_CPP(Audio::Settings::ExternalTransport, Model, JackTransport)
39✔
302
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE TRIAL · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc