26template <
typename Setup>
32 decltype ((
s.inputDeviceName))
name;
33 decltype ((
s.inputChannels)) channels;
34 decltype ((
s.useDefaultInputChannels)) useDefault;
37 return isInput ? SetupInfo {
s.inputDeviceName,
s.inputChannels,
s.useDefaultInputChannels }
38 : SetupInfo {
s.outputDeviceName,
s.outputChannels,
s.useDefaultOutputChannels };
43 return std::tie (
s.outputDeviceName,
48 s.useDefaultInputChannels,
50 s.useDefaultOutputChannels);
55 return tie (*
this) ==
tie (other);
60 return tie (*
this) !=
tie (other);
79 owner.audioDeviceIOCallbackInt (ins, numIns, outs, numOuts, numSamples, context);
84 owner.audioDeviceAboutToStartInt (device);
89 owner.audioDeviceStoppedInt();
104 owner.audioDeviceListChanged();
132 for (
auto*
t : types)
138 type->scanForDevices();
148 return !
ptr->getDeviceNames (
true) .isEmpty()
149 || !
ptr->getDeviceNames (
false).isEmpty();
153 if (deviceTypeHasDevices (
type))
158 deviceTypeHasDevices);
185 auto currentDeviceStillAvailable = [&]
192 if (currentTypeName == deviceType->getTypeName())
194 for (
auto& deviceName : deviceType->getDeviceNames (
true))
195 if (currentDeviceName == deviceName)
198 for (
auto& deviceName : deviceType->getDeviceNames (
false))
199 if (currentDeviceName == deviceName)
207 if (! currentDeviceStillAvailable)
226 if (device !=
nullptr)
249 if (newDeviceType !=
nullptr)
262 if (deviceTypeToRemove !=
nullptr)
268 if (
auto removed = std::unique_ptr<AudioIODeviceType> (
availableDeviceTypes.removeAndReturn (index)))
278 for (
auto& deviceName :
type->getDeviceNames (isInput))
279 if (deviceName.trim().equalsIgnoreCase (
name.trim()))
287 const int numOutputChannelsNeeded,
289 const bool selectDefaultDeviceOnFailure,
290 const String& preferredDefaultDeviceName,
300 if (xml !=
nullptr && xml->
hasTagName (
"DEVICESETUP"))
312 if (preferredSetupOptions !=
nullptr)
314 setup = *preferredSetupOptions;
316 else if (preferredDefaultDeviceName.
isNotEmpty())
318 const auto nameMatches = [&preferredDefaultDeviceName] (
const String&
name)
320 return name.matchesWildcard (preferredDefaultDeviceName,
true);
329 const auto getWildcardMatch = [&nameMatches] (
const StringArray& names)
331 const auto iter = std::find_if (names.begin(), names.end(), nameMatches);
332 return WildcardMatch { iter != names.end() ? *iter :
String(), iter != names.
end() };
335 struct WildcardMatches
337 WildcardMatch input, output;
342 return WildcardMatches { getWildcardMatch (
type->getDeviceNames (
true)),
343 getWildcardMatch (
type->getDeviceNames (
false)) };
356 const auto matches = getMatchesForType (
type);
358 if (matches.input.successful && matches.output.successful)
359 return SearchResult {
type->getTypeName(), matches.input.value, matches.output.value };
366 const auto matches = getMatchesForType (
type);
368 if (matches.input.successful || matches.output.successful)
369 return SearchResult {
type->getTypeName(), matches.input.value, matches.output.value };
386 bool selectDefaultDeviceOnFailure,
387 const String& preferredDefaultDeviceName,
395 if (preferredSetupOptions !=
nullptr)
396 setup = *preferredSetupOptions;
430 if (
error.isNotEmpty() && selectDefaultDeviceOnFailure)
441 for (
auto& device : available)
442 if (device.identifier == identifier)
450 for (
auto& device : available)
451 if (device.name ==
name)
452 return device.identifier;
461 if (isIdentifierAvailable (inputs,
info.identifier))
467 auto identifier = getUpdatedIdentifierForName (inputs,
info.name);
469 if (identifier.isNotEmpty())
479 if (isIdentifierAvailable (outputs, defaultOutputDeviceInfo.
identifier))
485 auto identifier = getUpdatedIdentifierForName (outputs, defaultOutputDeviceInfo.
name);
487 if (identifier.isNotEmpty())
495 int numOutputChannelsNeeded)
499 return initialise (numInputChannelsNeeded, numOutputChannelsNeeded,
500 nullptr,
false, {},
nullptr);
507 for (
const auto isInput : {
false,
true })
512 if (numChannelsNeeded > 0 &&
info.name.isEmpty())
513 info.name =
type->getDeviceNames (isInput) [
type->getDefaultDeviceIndex (isInput)];
536 type->scanForDevices();
545 if (
type->getTypeName() == typeName)
618 auto updateChannels = [] (
const String& deviceName,
BigInteger& channels,
int defaultNumChannels)
624 else if (defaultNumChannels != -1)
627 channels.setRange (0, defaultNumChannels,
true);
636 bool treatAsChosenDevice)
652 if (treatAsChosenDevice)
671 for (
const auto isInput : {
false,
true })
676 return "No such device: " +
name;
682 error =
"Can't open the audio device!\n\n"
683 "This may be because another application is currently using the same device - "
684 "if so, you should close any other applications and try again!";
688 if (
error.isNotEmpty())
704 if (treatAsChosenDevice)
729 if (treatAsChosenDevice)
746 if (rate > 0 && rates.contains (rate))
751 if (rate > 0 && rates.contains (rate))
754 double lowestAbove44 = 0.0;
756 for (
int i = rates.size(); --
i >= 0;)
760 if (sr >= 44100.0 && (lowestAbove44 < 1.0 || sr < lowestAbove44))
764 if (lowestAbove44 > 0.0)
765 return lowestAbove44;
774 if (bufferSize > 0 &&
currentAudioDevice->getAvailableBufferSizes().contains (bufferSize))
840 child->setAttribute (
"name", input->getName());
841 child->setAttribute (
"identifier", input->getIdentifier());
852 if (! availableMidiDevices.contains (
d))
856 child->setAttribute (
"name",
d.name);
857 child->setAttribute (
"identifier",
d.identifier);
888 if (callbackToRemove !=
nullptr)
895 needsDeinitialising = needsDeinitialising &&
callbacks.contains (callbackToRemove);
896 callbacks.removeFirstMatchingValue (callbackToRemove);
899 if (needsDeinitialising)
905 int numInputChannels,
906 float** outputChannelData,
907 int numOutputChannels,
913 inputLevelGetter->updateLevel (inputChannelData, numInputChannels, numSamples);
919 tempBuffer.setSize (
jmax (1, numOutputChannels),
jmax (1, numSamples),
false,
false,
true);
921 callbacks.getUnchecked(0)->audioDeviceIOCallbackWithContext (inputChannelData,
928 auto** tempChans =
tempBuffer.getArrayOfWritePointers();
932 callbacks.getUnchecked(
i)->audioDeviceIOCallbackWithContext (inputChannelData,
939 for (
int chan = 0; chan < numOutputChannels; ++chan)
941 if (
auto* src = tempChans [chan])
942 if (
auto* dst = outputChannelData [chan])
943 for (
int j = 0;
j < numSamples; ++
j)
950 for (
int i = 0;
i < numOutputChannels; ++
i)
951 zeromem (outputChannelData[
i], (
size_t) numSamples *
sizeof (
float));
959 for (
int i = 0;
i < numOutputChannels; ++
i)
960 if (
auto* dst = outputChannelData [
i])
961 for (
int j = 0;
j < numSamps; ++
j)
970 outputLevelGetter->updateLevel (
const_cast<const float**
> (outputChannelData), numOutputChannels, numSamples);
984 callbacks.getUnchecked(
i)->audioDeviceAboutToStart (device);
999 callbacks.getUnchecked(
i)->audioDeviceStopped();
1030 auto removePredicate = [identifier] (
const std::unique_ptr<MidiInput>&
in) {
return in->getIdentifier() == identifier; };
1043 if (mi->getIdentifier() == identifier)
1066 if (mc.callback == callbackToRemove && mc.deviceIdentifier == identifier)
1076 if (!
message.isActiveSense())
1081 if (mc.deviceIdentifier.isEmpty() || mc.deviceIdentifier == source->
getIdentifier())
1082 mc.callback->handleIncomingMidiMessage (source,
message);
1091 std::unique_ptr<MidiOutput> oldMidiPort;
1100 for (
int i = oldCallbacks.
size(); --
i >= 0;)
1114 for (
auto*
c : oldCallbacks)
1135 auto localLevel =
level.get();
1137 if (numChannels > 0)
1139 for (
int j = 0;
j < numSamples; ++
j)
1143 for (
int i = 0;
i < numChannels; ++
i)
1144 s += std::abs (channelData[
i][
j]);
1146 s /= (float) numChannels;
1148 const float decayFactor = 0.99992f;
1152 else if (localLevel > 0.001f)
1153 localLevel *= decayFactor;
1175 std::unique_ptr<AudioBuffer<float>> oldSound;
1188 auto soundLength = (
int) sampleRate;
1190 double frequency = 440.0;
1191 float amplitude = 0.5f;
1195 std::unique_ptr<AudioBuffer<float>> newSound (
new AudioBuffer<float> (1, soundLength));
1197 for (
int i = 0;
i < soundLength; ++
i)
1198 newSound->setSample (0,
i, amplitude * (
float) std::sin (
i * phasePerSample));
1200 newSound->applyGainRamp (0, 0, soundLength / 10, 0.0f, 1.0f);
1201 newSound->applyGainRamp (0, soundLength - soundLength / 4, soundLength / 4, 1.0f, 0.0f);
1222 if (device.name ==
name)
1233 if (device.name ==
name)
1249 if (device.name ==
name)
1268 if (device.name ==
name)
1281 if (device.name ==
name)
1293class AudioDeviceManagerTests :
public UnitTest
1298 void runTest()
override
1300 beginTest (
"When the AudioDeviceSetup has non-empty device names, initialise uses the requested devices");
1302 AudioDeviceManager manager;
1303 initialiseManager (manager);
1305 expectEquals (manager.getAvailableDeviceTypes().size(), 2);
1307 AudioDeviceManager::AudioDeviceSetup setup;
1308 setup.outputDeviceName =
"z";
1309 setup.inputDeviceName =
"c";
1311 expect (manager.initialise (2, 2,
nullptr,
true,
String{}, &setup).isEmpty());
1313 const auto& newSetup = manager.getAudioDeviceSetup();
1315 expectEquals (newSetup.outputDeviceName, setup.outputDeviceName);
1316 expectEquals (newSetup.inputDeviceName, setup.inputDeviceName);
1318 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1319 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 2);
1322 beginTest (
"When the AudioDeviceSetup has empty device names, initialise picks suitable default devices");
1324 AudioDeviceManager manager;
1325 initialiseManager (manager);
1327 AudioDeviceManager::AudioDeviceSetup setup;
1329 expect (manager.initialise (2, 2,
nullptr,
true, String{}, &setup).isEmpty());
1331 const auto& newSetup = manager.getAudioDeviceSetup();
1333 expectEquals (newSetup.outputDeviceName, String (
"x"));
1334 expectEquals (newSetup.inputDeviceName, String (
"a"));
1336 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1337 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 2);
1340 beginTest (
"When the preferred device name matches an input and an output on the same type, that type is used");
1342 AudioDeviceManager manager;
1343 initialiseManagerWithDifferentDeviceNames (manager);
1345 expect (manager.initialise (2, 2,
nullptr,
true,
"bar *").isEmpty());
1347 expectEquals (manager.getCurrentAudioDeviceType(), String (
"bar"));
1349 const auto& newSetup = manager.getAudioDeviceSetup();
1351 expectEquals (newSetup.outputDeviceName, String (
"bar out a"));
1352 expectEquals (newSetup.inputDeviceName, String (
"bar in a"));
1354 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1355 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 2);
1357 expect (manager.getCurrentAudioDevice() !=
nullptr);
1360 beginTest (
"When the preferred device name matches either an input and an output, but not both, that type is used");
1362 AudioDeviceManager manager;
1363 initialiseManagerWithDifferentDeviceNames (manager);
1365 expect (manager.initialise (2, 2,
nullptr,
true,
"bar out b").isEmpty());
1367 expectEquals (manager.getCurrentAudioDeviceType(), String (
"bar"));
1369 const auto& newSetup = manager.getAudioDeviceSetup();
1371 expectEquals (newSetup.outputDeviceName, String (
"bar out b"));
1372 expectEquals (newSetup.inputDeviceName, String (
"bar in a"));
1374 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1375 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 2);
1377 expect (manager.getCurrentAudioDevice() !=
nullptr);
1380 beginTest (
"When the preferred device name does not match any inputs or outputs, defaults are used");
1382 AudioDeviceManager manager;
1383 initialiseManagerWithDifferentDeviceNames (manager);
1385 expect (manager.initialise (2, 2,
nullptr,
true,
"unmatchable").isEmpty());
1387 expectEquals (manager.getCurrentAudioDeviceType(), String (
"foo"));
1389 const auto& newSetup = manager.getAudioDeviceSetup();
1391 expectEquals (newSetup.outputDeviceName, String (
"foo out a"));
1392 expectEquals (newSetup.inputDeviceName, String (
"foo in a"));
1394 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1395 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 2);
1397 expect (manager.getCurrentAudioDevice() !=
nullptr);
1400 beginTest (
"When first device type has no devices, a device type with devices is used instead");
1402 AudioDeviceManager manager;
1403 initialiseManagerWithEmptyDeviceType (manager);
1405 AudioDeviceManager::AudioDeviceSetup setup;
1407 expect (manager.initialise (2, 2,
nullptr,
true, {}, &setup).isEmpty());
1409 const auto& newSetup = manager.getAudioDeviceSetup();
1411 expectEquals (newSetup.outputDeviceName, String (
"x"));
1412 expectEquals (newSetup.inputDeviceName, String (
"a"));
1414 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1415 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 2);
1418 beginTest (
"If a device type has been explicitly set to a type with devices, "
1419 "initialisation should respect this choice");
1421 AudioDeviceManager manager;
1422 initialiseManagerWithEmptyDeviceType (manager);
1423 manager.setCurrentAudioDeviceType (mockBName,
true);
1425 AudioDeviceManager::AudioDeviceSetup setup;
1426 expect (manager.initialise (2, 2,
nullptr,
true, {}, &setup).isEmpty());
1428 expectEquals (manager.getCurrentAudioDeviceType(), mockBName);
1431 beginTest (
"If a device type has been explicitly set to a type without devices, "
1432 "initialisation should pick a type with devices instead");
1434 AudioDeviceManager manager;
1435 initialiseManagerWithEmptyDeviceType (manager);
1436 manager.setCurrentAudioDeviceType (emptyName,
true);
1438 AudioDeviceManager::AudioDeviceSetup setup;
1439 expect (manager.initialise (2, 2,
nullptr,
true, {}, &setup).isEmpty());
1441 expectEquals (manager.getCurrentAudioDeviceType(), mockAName);
1444 beginTest (
"Carry out a long sequence of configuration changes");
1446 AudioDeviceManager manager;
1447 initialiseManagerWithEmptyDeviceType (manager);
1448 initialiseWithDefaultDevices (manager);
1449 disableInputChannelsButLeaveDeviceOpen (manager);
1450 selectANewInputDevice (manager);
1451 disableInputDevice (manager);
1452 reenableInputDeviceWithNoChannels (manager);
1453 enableInputChannels (manager);
1454 disableInputChannelsButLeaveDeviceOpen (manager);
1455 switchDeviceType (manager);
1456 enableInputChannels (manager);
1457 closeDeviceByRequestingEmptyNames (manager);
1460 beginTest (
"AudioDeviceManager updates its current settings before notifying callbacks when device restarts itself");
1462 AudioDeviceManager manager;
1463 auto deviceType = std::make_unique<MockDeviceType> (
"foo",
1464 StringArray {
"foo in a",
"foo in b" },
1465 StringArray {
"foo out a",
"foo out b" });
1466 auto*
ptr = deviceType.get();
1467 manager.addAudioDeviceType (std::move (deviceType));
1469 AudioDeviceManager::AudioDeviceSetup setup;
1470 setup.sampleRate = 48000.0;
1471 setup.bufferSize = 256;
1472 setup.inputDeviceName =
"foo in a";
1473 setup.outputDeviceName =
"foo out a";
1474 setup.useDefaultInputChannels =
true;
1475 setup.useDefaultOutputChannels =
true;
1476 manager.setAudioDeviceSetup (setup,
true);
1478 const auto currentSetup = manager.getAudioDeviceSetup();
1479 expectEquals (currentSetup.sampleRate, setup.sampleRate);
1480 expectEquals (currentSetup.bufferSize, setup.bufferSize);
1483 manager.addAudioCallback (&
callback);
1485 constexpr auto newSr = 10000.0;
1486 constexpr auto newBs = 1024;
1493 const auto current = manager.getAudioDeviceSetup();
1494 expectEquals (current.sampleRate, newSr);
1495 expectEquals (current.bufferSize, newBs);
1498 ptr->restartDevices (newSr, newBs);
1499 expectEquals (numCalls, 1);
1504 void initialiseWithDefaultDevices (AudioDeviceManager& manager)
1506 manager.initialiseWithDefaultDevices (2, 2);
1507 const auto& setup = manager.getAudioDeviceSetup();
1509 expectEquals (setup.inputChannels.countNumberOfSetBits(), 2);
1510 expectEquals (setup.outputChannels.countNumberOfSetBits(), 2);
1512 expect (setup.useDefaultInputChannels);
1513 expect (setup.useDefaultOutputChannels);
1515 expect (manager.getCurrentAudioDevice() !=
nullptr);
1518 void disableInputChannelsButLeaveDeviceOpen (AudioDeviceManager& manager)
1520 auto setup = manager.getAudioDeviceSetup();
1521 setup.inputChannels.clear();
1522 setup.useDefaultInputChannels =
false;
1524 expect (manager.setAudioDeviceSetup (setup,
true).isEmpty());
1526 const auto newSetup = manager.getAudioDeviceSetup();
1527 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 0);
1528 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1530 expect (! newSetup.useDefaultInputChannels);
1531 expect (newSetup.useDefaultOutputChannels);
1533 expectEquals (newSetup.inputDeviceName, setup.inputDeviceName);
1534 expectEquals (newSetup.outputDeviceName, setup.outputDeviceName);
1536 expect (manager.getCurrentAudioDevice() !=
nullptr);
1539 void selectANewInputDevice (AudioDeviceManager& manager)
1541 auto setup = manager.getAudioDeviceSetup();
1542 setup.inputDeviceName =
"b";
1544 expect (manager.setAudioDeviceSetup (setup,
true).isEmpty());
1546 const auto newSetup = manager.getAudioDeviceSetup();
1547 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 0);
1548 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1550 expect (! newSetup.useDefaultInputChannels);
1551 expect (newSetup.useDefaultOutputChannels);
1553 expectEquals (newSetup.inputDeviceName, setup.inputDeviceName);
1554 expectEquals (newSetup.outputDeviceName, setup.outputDeviceName);
1556 expect (manager.getCurrentAudioDevice() !=
nullptr);
1559 void disableInputDevice (AudioDeviceManager& manager)
1561 auto setup = manager.getAudioDeviceSetup();
1562 setup.inputDeviceName =
"";
1564 expect (manager.setAudioDeviceSetup (setup,
true).isEmpty());
1566 const auto newSetup = manager.getAudioDeviceSetup();
1567 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 0);
1568 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1570 expect (! newSetup.useDefaultInputChannels);
1571 expect (newSetup.useDefaultOutputChannels);
1573 expectEquals (newSetup.inputDeviceName, setup.inputDeviceName);
1574 expectEquals (newSetup.outputDeviceName, setup.outputDeviceName);
1576 expect (manager.getCurrentAudioDevice() !=
nullptr);
1579 void reenableInputDeviceWithNoChannels (AudioDeviceManager& manager)
1581 auto setup = manager.getAudioDeviceSetup();
1582 setup.inputDeviceName =
"a";
1584 expect (manager.setAudioDeviceSetup (setup,
true).isEmpty());
1586 const auto newSetup = manager.getAudioDeviceSetup();
1587 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 0);
1588 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1590 expect (! newSetup.useDefaultInputChannels);
1591 expect (newSetup.useDefaultOutputChannels);
1593 expectEquals (newSetup.inputDeviceName, setup.inputDeviceName);
1594 expectEquals (newSetup.outputDeviceName, setup.outputDeviceName);
1596 expect (manager.getCurrentAudioDevice() !=
nullptr);
1599 void enableInputChannels (AudioDeviceManager& manager)
1601 auto setup = manager.getAudioDeviceSetup();
1602 setup.inputDeviceName = manager.getCurrentDeviceTypeObject()->getDeviceNames (
true)[0];
1603 setup.inputChannels = 3;
1604 setup.useDefaultInputChannels =
false;
1606 expect (manager.setAudioDeviceSetup (setup,
true).isEmpty());
1608 const auto newSetup = manager.getAudioDeviceSetup();
1609 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 2);
1610 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1612 expect (! newSetup.useDefaultInputChannels);
1613 expect (newSetup.useDefaultOutputChannels);
1615 expectEquals (newSetup.inputDeviceName, setup.inputDeviceName);
1616 expectEquals (newSetup.outputDeviceName, setup.outputDeviceName);
1618 expect (manager.getCurrentAudioDevice() !=
nullptr);
1621 void switchDeviceType (AudioDeviceManager& manager)
1623 const auto oldSetup = manager.getAudioDeviceSetup();
1625 expectEquals (manager.getCurrentAudioDeviceType(), String (mockAName));
1627 manager.setCurrentAudioDeviceType (mockBName,
true);
1629 expectEquals (manager.getCurrentAudioDeviceType(), String (mockBName));
1631 const auto newSetup = manager.getAudioDeviceSetup();
1633 expect (newSetup.outputDeviceName.isNotEmpty());
1635 expect (newSetup.inputDeviceName.isEmpty());
1637 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 0);
1638 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1640 expect (manager.getCurrentAudioDevice() !=
nullptr);
1643 void closeDeviceByRequestingEmptyNames (AudioDeviceManager& manager)
1645 auto setup = manager.getAudioDeviceSetup();
1646 setup.inputDeviceName =
"";
1647 setup.outputDeviceName =
"";
1649 expect (manager.setAudioDeviceSetup (setup,
true).isEmpty());
1651 const auto newSetup = manager.getAudioDeviceSetup();
1652 expectEquals (newSetup.inputChannels.countNumberOfSetBits(), 2);
1653 expectEquals (newSetup.outputChannels.countNumberOfSetBits(), 2);
1655 expect (newSetup.inputDeviceName.isEmpty());
1656 expect (newSetup.outputDeviceName.isEmpty());
1658 expect (manager.getCurrentAudioDevice() ==
nullptr);
1661 const String mockAName =
"mockA";
1662 const String mockBName =
"mockB";
1663 const String emptyName =
"empty";
1667 virtual ~Restartable() =
default;
1668 virtual void restart (
double newSr,
int newBs) = 0;
1671 class MockDevice :
public AudioIODevice,
1675 MockDevice (ListenerList<Restartable>&
l, String typeNameIn, String outNameIn, String inNameIn)
1676 : AudioIODevice (
"mock", typeNameIn), listeners (
l), outName (outNameIn), inName (inNameIn)
1678 listeners.add (
this);
1681 ~MockDevice()
override
1683 listeners.remove (
this);
1686 StringArray getOutputChannelNames()
override {
return {
"o1",
"o2",
"o3" }; }
1687 StringArray getInputChannelNames()
override {
return {
"i1",
"i2",
"i3" }; }
1689 Array<double> getAvailableSampleRates()
override {
return { 44100.0, 48000.0 }; }
1690 Array<int> getAvailableBufferSizes()
override {
return { 128, 256 }; }
1691 int getDefaultBufferSize()
override {
return 128; }
1693 String open (
const BigInteger& inputs,
const BigInteger& outputs,
double sr,
int bs)
override
1695 inChannels = inputs;
1696 outChannels = outputs;
1703 void close()
override { on =
false; }
1704 bool isOpen()
override {
return on; }
1706 void start (AudioIODeviceCallback*
c)
override
1709 callback->audioDeviceAboutToStart (
this);
1713 void stop()
override
1719 bool isPlaying()
override {
return playing; }
1721 String getLastError()
override {
return {}; }
1722 int getCurrentBufferSizeSamples()
override {
return blockSize; }
1723 double getCurrentSampleRate()
override {
return sampleRate; }
1724 int getCurrentBitDepth()
override {
return 16; }
1726 BigInteger getActiveOutputChannels()
const override {
return outChannels; }
1727 BigInteger getActiveInputChannels()
const override {
return inChannels; }
1729 int getOutputLatencyInSamples()
override {
return 0; }
1730 int getInputLatencyInSamples()
override {
return 0; }
1733 void restart (
double newSr,
int newBs)
override
1737 open (inChannels, outChannels, newSr, newBs);
1741 ListenerList<Restartable>& listeners;
1742 AudioIODeviceCallback*
callback =
nullptr;
1743 String outName, inName;
1744 BigInteger outChannels, inChannels;
1745 double sampleRate = 0.0;
1747 bool on =
false, playing =
false;
1750 class MockDeviceType :
public AudioIODeviceType
1753 explicit MockDeviceType (String kind)
1754 : MockDeviceType (std::
move (kind), {
"a",
"b",
"c" }, {
"x",
"y",
"z" }) {}
1756 MockDeviceType (String kind, StringArray inputNames, StringArray outputNames)
1757 : AudioIODeviceType (std::
move (kind)),
1758 inNames (std::
move (inputNames)),
1759 outNames (std::
move (outputNames)) {}
1761 ~MockDeviceType()
override
1764 jassert (listeners.isEmpty());
1767 void scanForDevices()
override {}
1769 StringArray getDeviceNames (
bool isInput)
const override
1771 return getNames (isInput);
1774 int getDefaultDeviceIndex (
bool)
const override {
return 0; }
1776 int getIndexOfDevice (AudioIODevice* device,
bool isInput)
const override
1778 return getNames (isInput).indexOf (device->getName());
1781 bool hasSeparateInputsAndOutputs()
const override {
return true; }
1783 AudioIODevice* createDevice (
const String& outputName,
const String& inputName)
override
1785 if (inNames.contains (inputName) || outNames.contains (outputName))
1786 return new MockDevice (listeners, getTypeName(), outputName, inputName);
1793 void restartDevices (
double newSr,
int newBs)
1795 listeners.call ([&] (
auto&
l) {
return l.restart (newSr, newBs); });
1799 const StringArray& getNames (
bool isInput)
const {
return isInput ? inNames : outNames; }
1801 const StringArray inNames, outNames;
1802 ListenerList<Restartable> listeners;
1805 class MockCallback :
public AudioIODeviceCallback
1809 std::function<
void()> aboutToStart;
1810 std::function<
void()> stopped;
1813 void audioDeviceIOCallback (
const float**,
int,
float**,
int,
int)
override { NullCheckedInvocation::invoke (
callback); }
1814 void audioDeviceAboutToStart (AudioIODevice*)
override { NullCheckedInvocation::invoke (aboutToStart); }
1815 void audioDeviceStopped()
override { NullCheckedInvocation::invoke (stopped); }
1816 void audioDeviceError (
const String&)
override { NullCheckedInvocation::invoke (
error); }
1819 void initialiseManager (AudioDeviceManager& manager)
1821 manager.addAudioDeviceType (std::make_unique<MockDeviceType> (mockAName));
1822 manager.addAudioDeviceType (std::make_unique<MockDeviceType> (mockBName));
1825 void initialiseManagerWithEmptyDeviceType (AudioDeviceManager& manager)
1827 manager.addAudioDeviceType (std::make_unique<MockDeviceType> (emptyName, StringArray{}, StringArray{}));
1828 initialiseManager (manager);
1831 void initialiseManagerWithDifferentDeviceNames (AudioDeviceManager& manager)
1833 manager.addAudioDeviceType (std::make_unique<MockDeviceType> (
"foo",
1834 StringArray {
"foo in a",
"foo in b" },
1835 StringArray {
"foo out a",
"foo out b" }));
1837 manager.addAudioDeviceType (std::make_unique<MockDeviceType> (
"bar",
1838 StringArray {
"bar in a",
"bar in b" },
1839 StringArray {
"bar out a",
"bar out b" }));
1843static AudioDeviceManagerTests audioDeviceManagerTests;
Type jmin(const Type a, const Type b)
Definition MathsFunctions.h:60
Type jmax(const Type a, const Type b)
Definition MathsFunctions.h:48
#define noexcept
Definition DistrhoDefines.h:72
CAdPlugDatabase::CRecord::RecordType type
Definition adplugdb.cpp:93
static void message(int level, const char *fmt,...)
Definition adplugdb.cpp:120
Definition juce_Array.h:56
void swapWith(OtherArrayType &otherArray) noexcept
Definition juce_Array.h:621
ElementType getUnchecked(int index) const
Definition juce_Array.h:252
int size() const noexcept
Definition juce_Array.h:215
Definition juce_AudioSampleBuffer.h:34
Definition juce_AudioDeviceManager.cpp:67
void audioDeviceListChanged() override
Definition juce_AudioDeviceManager.cpp:102
AudioDeviceManager & owner
Definition juce_AudioDeviceManager.cpp:107
void audioDeviceIOCallbackWithContext(const float **ins, int numIns, float **outs, int numOuts, int numSamples, const AudioIODeviceCallbackContext &context) override
Definition juce_AudioDeviceManager.cpp:72
void audioDeviceAboutToStart(AudioIODevice *device) override
Definition juce_AudioDeviceManager.cpp:82
void handleIncomingMidiMessage(MidiInput *source, const MidiMessage &message) override
Definition juce_AudioDeviceManager.cpp:97
CallbackHandler(AudioDeviceManager &adm) noexcept
Definition juce_AudioDeviceManager.cpp:69
void audioDeviceError(const String &message) override
Definition juce_AudioDeviceManager.cpp:92
void audioDeviceStopped() override
Definition juce_AudioDeviceManager.cpp:87
bool isMidiInputDeviceEnabled(const String &deviceIdentifier) const
Definition juce_AudioDeviceManager.cpp:1040
AudioDeviceManager()
Definition juce_AudioDeviceManager.cpp:113
String preferredDeviceName
Definition juce_AudioDeviceManager.h:498
int numInputChansNeeded
Definition juce_AudioDeviceManager.h:497
void handleIncomingMidiMessageInt(MidiInput *, const MidiMessage &)
Definition juce_AudioDeviceManager.cpp:1074
void removeAudioDeviceType(AudioIODeviceType *deviceTypeToRemove)
Definition juce_AudioDeviceManager.cpp:260
Array< MidiDeviceInfo > midiDeviceInfosFromXml
Definition juce_AudioDeviceManager.h:509
AudioDeviceSetup getAudioDeviceSetup() const
Definition juce_AudioDeviceManager.cpp:563
void insertDefaultDeviceNames(AudioDeviceSetup &) const
Definition juce_AudioDeviceManager.cpp:503
std::vector< std::unique_ptr< MidiInput > > enabledMidiInputs
Definition juce_AudioDeviceManager.h:510
void removeMidiInputDeviceCallback(const String &deviceIdentifier, MidiInputCallback *callback)
Definition juce_AudioDeviceManager.cpp:1060
double getCpuUsage() const
Definition juce_AudioDeviceManager.cpp:1010
void createDeviceTypesIfNeeded()
Definition juce_AudioDeviceManager.cpp:125
AudioIODeviceType * getCurrentDeviceTypeObject() const
Definition juce_AudioDeviceManager.cpp:607
void audioDeviceStoppedInt()
Definition juce_AudioDeviceManager.cpp:990
String setAudioDeviceSetup(const AudioDeviceSetup &newSetup, bool treatAsChosenDevice)
Definition juce_AudioDeviceManager.cpp:635
void removeMidiInputCallback(const String &, MidiInputCallback *)
Definition juce_AudioDeviceManager.cpp:1258
void audioDeviceIOCallbackInt(const float **inputChannelData, int totalNumInputChannels, float **outputChannelData, int totalNumOutputChannels, int numSamples, const AudioIODeviceCallbackContext &context)
Definition juce_AudioDeviceManager.cpp:904
AudioDeviceSetup currentSetup
Definition juce_AudioDeviceManager.h:494
bool isMidiInputEnabled(const String &) const
Definition juce_AudioDeviceManager.cpp:1230
MidiDeviceInfo defaultMidiOutputDeviceInfo
Definition juce_AudioDeviceManager.h:513
virtual void createAudioDeviceTypes(OwnedArray< AudioIODeviceType > &types)
Definition juce_AudioDeviceManager.cpp:230
void stopDevice()
Definition juce_AudioDeviceManager.cpp:780
void audioDeviceErrorInt(const String &)
Definition juce_AudioDeviceManager.cpp:1002
void deleteCurrentDevice()
Definition juce_AudioDeviceManager.cpp:573
std::unique_ptr< AudioIODevice > currentAudioDevice
Definition juce_AudioDeviceManager.h:495
std::unique_ptr< CallbackHandler > callbackHandler
Definition juce_AudioDeviceManager.h:527
void setMidiInputEnabled(const String &, bool)
Definition juce_AudioDeviceManager.cpp:1218
void audioDeviceAboutToStartInt(AudioIODevice *)
Definition juce_AudioDeviceManager.cpp:973
void setDefaultMidiOutputDevice(const String &deviceIdentifier)
Definition juce_AudioDeviceManager.cpp:1087
CriticalSection audioCallbackLock
Definition juce_AudioDeviceManager.h:515
void setMidiInputDeviceEnabled(const String &deviceIdentifier, bool enabled)
Definition juce_AudioDeviceManager.cpp:1016
void setDefaultMidiOutput(const String &)
Definition juce_AudioDeviceManager.cpp:1277
void audioDeviceListChanged()
Definition juce_AudioDeviceManager.cpp:181
int getXRunCount() const noexcept
Definition juce_AudioDeviceManager.cpp:1210
void pickCurrentDeviceTypeWithDevices()
Definition juce_AudioDeviceManager.cpp:144
OwnedArray< AudioDeviceSetup > lastDeviceTypeConfigs
Definition juce_AudioDeviceManager.h:492
Array< MidiCallbackInfo > midiCallbacks
Definition juce_AudioDeviceManager.h:511
AudioBuffer< float > tempBuffer
Definition juce_AudioDeviceManager.h:501
LevelMeter::Ptr outputLevelGetter
Definition juce_AudioDeviceManager.h:523
void addMidiInputCallback(const String &, MidiInputCallback *)
Definition juce_AudioDeviceManager.cpp:1239
void addMidiInputDeviceCallback(const String &deviceIdentifier, MidiInputCallback *callback)
Definition juce_AudioDeviceManager.cpp:1049
OwnedArray< AudioIODeviceType > availableDeviceTypes
Definition juce_AudioDeviceManager.h:491
void setCurrentAudioDeviceType(const String &type, bool treatAsChosenDevice)
Definition juce_AudioDeviceManager.cpp:580
void updateCurrentSetup()
Definition juce_AudioDeviceManager.cpp:170
std::unique_ptr< MidiOutput > defaultMidiOutput
Definition juce_AudioDeviceManager.h:514
~AudioDeviceManager() override
Definition juce_AudioDeviceManager.cpp:118
const OwnedArray< AudioIODeviceType > & getAvailableDeviceTypes()
Definition juce_AudioDeviceManager.cpp:164
int numOutputChansNeeded
Definition juce_AudioDeviceManager.h:497
void scanDevicesIfNeeded()
Definition juce_AudioDeviceManager.cpp:527
String initialise(int numInputChannelsNeeded, int numOutputChannelsNeeded, const XmlElement *savedState, bool selectDefaultDeviceOnFailure, const String &preferredDefaultDeviceName=String(), const AudioDeviceSetup *preferredSetupOptions=nullptr)
Definition juce_AudioDeviceManager.cpp:286
void addAudioCallback(AudioIODeviceCallback *newCallback)
Definition juce_AudioDeviceManager.cpp:870
LevelMeter::Ptr inputLevelGetter
Definition juce_AudioDeviceManager.h:522
String currentDeviceType
Definition juce_AudioDeviceManager.h:498
std::unique_ptr< XmlElement > lastExplicitSettings
Definition juce_AudioDeviceManager.h:499
String initialiseWithDefaultDevices(int numInputChannelsNeeded, int numOutputChannelsNeeded)
Definition juce_AudioDeviceManager.cpp:494
void restartLastAudioDevice()
Definition juce_AudioDeviceManager.cpp:795
AudioIODeviceType * findType(const String &inputName, const String &outputName)
Definition juce_AudioDeviceManager.cpp:551
String initialiseDefault(const String &preferredDefaultDeviceName, const AudioDeviceSetup *)
Definition juce_AudioDeviceManager.cpp:307
int testSoundPosition
Definition juce_AudioDeviceManager.h:518
Array< AudioIODeviceCallback * > callbacks
Definition juce_AudioDeviceManager.h:496
void updateXml()
Definition juce_AudioDeviceManager.cpp:814
std::unique_ptr< AudioBuffer< float > > testSound
Definition juce_AudioDeviceManager.h:517
void removeAudioCallback(AudioIODeviceCallback *callback)
Definition juce_AudioDeviceManager.cpp:886
int chooseBestBufferSize(int preferred) const
Definition juce_AudioDeviceManager.cpp:770
CriticalSection midiCallbackLock
Definition juce_AudioDeviceManager.h:515
AudioProcessLoadMeasurer loadMeasurer
Definition juce_AudioDeviceManager.h:520
void playTestSound()
Definition juce_AudioDeviceManager.cpp:1172
double chooseBestSampleRate(double preferred) const
Definition juce_AudioDeviceManager.cpp:740
bool listNeedsScanning
Definition juce_AudioDeviceManager.h:500
void addAudioDeviceType(std::unique_ptr< AudioIODeviceType > newDeviceType)
Definition juce_AudioDeviceManager.cpp:247
String initialiseFromXML(const XmlElement &, bool selectDefaultDeviceOnFailure, const String &preferredDefaultDeviceName, const AudioDeviceSetup *)
Definition juce_AudioDeviceManager.cpp:385
void closeAudioDevice()
Definition juce_AudioDeviceManager.cpp:788
std::unique_ptr< XmlElement > createStateXml() const
Definition juce_AudioDeviceManager.cpp:518
Definition juce_AudioIODevice.h:51
virtual void audioDeviceAboutToStart(AudioIODevice *device)=0
virtual void audioDeviceStopped()=0
Definition juce_AudioIODevice.h:164
virtual double getCurrentSampleRate()=0
virtual int getCurrentBufferSizeSamples()=0
Definition juce_AudioIODeviceType.h:126
Definition juce_AudioIODeviceType.h:62
static AudioIODeviceType * createAudioIODeviceType_WASAPI(WASAPIDeviceMode deviceMode)
Definition juce_AudioIODeviceType.cpp:75
static AudioIODeviceType * createAudioIODeviceType_ASIO()
Definition juce_AudioIODeviceType.cpp:88
static AudioIODeviceType * createAudioIODeviceType_Oboe()
Definition juce_AudioIODeviceType.cpp:143
static AudioIODeviceType * createAudioIODeviceType_JACK()
Definition juce_AudioIODeviceType.cpp:100
static AudioIODeviceType * createAudioIODeviceType_DirectSound()
Definition juce_AudioIODeviceType.cpp:82
static AudioIODeviceType * createAudioIODeviceType_Android()
Definition juce_AudioIODeviceType.cpp:125
static AudioIODeviceType * createAudioIODeviceType_OpenSLES()
Definition juce_AudioIODeviceType.cpp:134
static AudioIODeviceType * createAudioIODeviceType_CoreAudio()
Definition juce_AudioIODeviceType.cpp:48
static AudioIODeviceType * createAudioIODeviceType_Bela()
Definition juce_AudioIODeviceType.cpp:106
static AudioIODeviceType * createAudioIODeviceType_ALSA()
Definition juce_AudioIODeviceType.cpp:94
static AudioIODeviceType * createAudioIODeviceType_iOSAudio()
Definition juce_AudioIODeviceType.cpp:54
Definition juce_BigInteger.h:39
void parseString(StringRef text, int base)
Definition juce_BigInteger.cpp:1128
void sendChangeMessage()
Definition juce_ChangeBroadcaster.cpp:65
void sendSynchronousChangeMessage()
Definition juce_ChangeBroadcaster.cpp:71
Definition juce_MidiMessage.h:35
static std::unique_ptr< MidiOutput > openDevice(const String &deviceIdentifier)
Definition juce_linux_Bela.cpp:594
static Array< MidiDeviceInfo > getAvailableDevices()
Definition juce_linux_Bela.cpp:592
Definition juce_OwnedArray.h:51
void clear(bool deleteObjects=true)
Definition juce_OwnedArray.h:107
int getReferenceCount() const noexcept
Definition juce_ReferenceCountedObject.h:101
Definition juce_StringArray.h:35
Definition juce_String.h:53
bool isEmpty() const noexcept
Definition juce_String.h:310
CharPointerType end() const
Definition juce_String.h:949
bool isNotEmpty() const noexcept
Definition juce_String.h:316
static void JUCE_CALLTYPE sleep(int milliseconds)
Definition juce_posix_SharedCode.h:44
Definition juce_UnitTest.h:70
Definition juce_XmlElement.h:83
double getDoubleAttribute(StringRef attributeName, double defaultReturnValue=0.0) const
Definition juce_XmlElement.cpp:579
Iterator< GetNextElementWithTagName > getChildWithTagNameIterator(StringRef name) const
Definition juce_XmlElement.h:730
bool hasAttribute(StringRef attributeName) const noexcept
Definition juce_XmlElement.cpp:549
bool hasTagName(StringRef possibleTagName) const noexcept
Definition juce_XmlElement.cpp:470
int getIntAttribute(StringRef attributeName, int defaultReturnValue=0) const
Definition juce_XmlElement.cpp:571
const String & getStringAttribute(StringRef attributeName) const noexcept
Definition juce_XmlElement.cpp:555
* e
Definition inflate.c:1404
int * l
Definition inflate.c:1579
struct huft * t
Definition inflate.c:943
register unsigned j
Definition inflate.c:1576
unsigned d
Definition inflate.c:940
register unsigned i
Definition inflate.c:1575
unsigned s
Definition inflate.c:1555
static PuglViewHint int value
Definition pugl.h:1708
static const char * name
Definition pugl.h:1582
virtual ASIOError stop()=0
virtual ASIOError start()=0
struct backing_store_struct * info
Definition jmemsys.h:183
float in
Definition lilv_test.c:1460
Definition juce_UnitTestCategories.h:27
void move(void *from, void *to)
Definition juce_FixedSizeFunction.h:53
Definition carla_juce.cpp:31
CriticalSection::ScopedLockType ScopedLock
Definition juce_CriticalSection.h:186
static void addIfNotNull(OwnedArray< AudioIODeviceType > &list, AudioIODeviceType *const device)
Definition juce_AudioDeviceManager.cpp:224
constexpr Type jmax(Type a, Type b)
Definition juce_MathsFunctions.h:94
static bool deviceListContains(AudioIODeviceType *type, bool isInput, const String &name)
Definition juce_AudioDeviceManager.cpp:276
static auto tie(const AudioDeviceManager::AudioDeviceSetup &s)
Definition juce_AudioDeviceManager.cpp:41
jack_client_t client jack_client_t client jack_client_t client jack_client_t JackInfoShutdownCallback void arg jack_client_t jack_port_t port void func jack_client_t const char const char unsigned long flags const jack_port_t port jack_client_t jack_port_id_t port_id const jack_port_t const char port_name const jack_port_t port void * ptr
Definition juce_linux_JackAudio.cpp:79
static void updateSetupChannels(AudioDeviceManager::AudioDeviceSetup &setup, int defaultNumIns, int defaultNumOuts)
Definition juce_AudioDeviceManager.cpp:616
static auto getSetupInfo(Setup &s, bool isInput)
Definition juce_AudioDeviceManager.cpp:27
@ shared
Definition juce_audio_devices.h:175
@ exclusive
Definition juce_audio_devices.h:176
@ sharedLowLatency
Definition juce_audio_devices.h:177
@ list
Definition juce_AccessibilityRole.h:56
void zeromem(void *memory, size_t numBytes) noexcept
Definition juce_Memory.h:28
Definition juce_AudioDeviceManager.h:91
String outputDeviceName
Definition juce_AudioDeviceManager.h:97
bool useDefaultInputChannels
Definition juce_AudioDeviceManager.h:128
String inputDeviceName
Definition juce_AudioDeviceManager.h:102
BigInteger outputChannels
Definition juce_AudioDeviceManager.h:135
double sampleRate
Definition juce_AudioDeviceManager.h:109
BigInteger inputChannels
Definition juce_AudioDeviceManager.h:122
int bufferSize
Definition juce_AudioDeviceManager.h:115
bool useDefaultOutputChannels
Definition juce_AudioDeviceManager.h:141
double getCurrentLevel() const noexcept
Definition juce_AudioDeviceManager.cpp:1166
void updateLevel(const float *const *, int numChannels, int numSamples) noexcept
Definition juce_AudioDeviceManager.cpp:1130
LevelMeter() noexcept
Definition juce_AudioDeviceManager.cpp:1128
Atomic< float > level
Definition juce_AudioDeviceManager.h:433
Definition juce_AudioIODevice.h:30
Definition juce_AudioProcessLoadMeasurer.h:73
static constexpr FloatType twoPi
Definition juce_MathsFunctions.h:385
Definition juce_MidiDevices.h:37
String name
Definition juce_MidiDevices.h:54
String identifier
Definition juce_MidiDevices.h:61
RECT const char void(* callback)(const char *droppath))) SWELL_API_DEFINE(BOOL
Definition swell-functions.h:1004
return c
Definition crypt.c:175
int result
Definition process.c:1455
typedef int(UZ_EXP MsgFn)()
#define void
Definition unzip.h:396
#define const
Definition zconf.h:137