Skip to content

Commit 50793b4

Browse files
authored
Merge pull request #291 from tne-lab/load-audio-settings
Save and load all audio settings
2 parents f63883b + 26a193c commit 50793b4

3 files changed

Lines changed: 79 additions & 23 deletions

File tree

Source/Audio/AudioComponent.cpp

Lines changed: 71 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -123,23 +123,6 @@ AudioComponent::~AudioComponent()
123123

124124
}
125125

126-
void AudioComponent::setBufferSize(int s)
127-
{
128-
AudioDeviceManager::AudioDeviceSetup setup;
129-
deviceManager.getAudioDeviceSetup(setup);
130-
131-
if (s > 16 && s < 6000)
132-
{
133-
setup.bufferSize = s;
134-
deviceManager.setAudioDeviceSetup(setup, false);
135-
}
136-
else
137-
{
138-
std::cout << "Buffer size out of range." << std::endl;
139-
}
140-
141-
}
142-
143126
int AudioComponent::getBufferSize()
144127
{
145128
AudioDeviceManager::AudioDeviceSetup setup;
@@ -280,3 +263,74 @@ void AudioComponent::endCallbacks()
280263

281264
}
282265

266+
void AudioComponent::saveStateToXml(XmlElement* parent)
267+
{
268+
// JUCE's audioState XML format (includes all info)
269+
ScopedPointer<XmlElement> audioState = deviceManager.createStateXml();
270+
271+
if (audioState != nullptr)
272+
{
273+
parent->addChildElement(audioState.release());
274+
}
275+
276+
// Save type, buffer size, and sample rate as attributes separately
277+
// in case part of the audioState is invalid later, like the specific device names.
278+
AudioDeviceManager::AudioDeviceSetup setup;
279+
deviceManager.getAudioDeviceSetup(setup);
280+
281+
parent->setAttribute("sampleRate", setup.sampleRate);
282+
parent->setAttribute("bufferSize", setup.bufferSize);
283+
parent->setAttribute("deviceType", deviceManager.getCurrentAudioDeviceType());
284+
}
285+
286+
void AudioComponent::loadStateFromXml(XmlElement* parent)
287+
{
288+
forEachXmlChildElement(*parent, child)
289+
{
290+
if (!child->isTextElement())
291+
{
292+
deviceManager.closeAudioDevice(); // necessary to ensure correct device type gets created
293+
294+
String error = deviceManager.initialise(
295+
0, // numInputChannelsNeeded
296+
2, // numOutputChannelsNeeded
297+
child, // savedState
298+
true, // selectDefaultDeviceOnFailure
299+
String::empty, // preferred device
300+
nullptr); // preferred device setup options
301+
302+
if (error.isEmpty())
303+
{
304+
break;
305+
}
306+
}
307+
}
308+
309+
// Now the important parameters separately, as a backup (in case the devices have different names or something)
310+
String deviceType = parent->getStringAttribute("deviceType", String::empty);
311+
if (!deviceType.isEmpty())
312+
{
313+
deviceManager.setCurrentAudioDeviceType(deviceType, true);
314+
}
315+
316+
AudioDeviceManager::AudioDeviceSetup setup;
317+
deviceManager.getAudioDeviceSetup(setup);
318+
319+
double sampleRate = parent->getDoubleAttribute("sampleRate");
320+
if (sampleRate > 0)
321+
{
322+
setup.sampleRate = sampleRate;
323+
}
324+
325+
int bufferSize = parent->getIntAttribute("bufferSize");
326+
if (bufferSize > 16 && bufferSize < 6000)
327+
{
328+
setup.bufferSize = bufferSize;
329+
}
330+
else
331+
{
332+
std::cout << "Buffer size out of range." << std::endl;
333+
}
334+
335+
deviceManager.setAudioDeviceSetup(setup, true);
336+
}

Source/Audio/AudioComponent.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,11 @@ class AudioComponent
8282
/** Returns the buffer size (in ms) currently being used.*/
8383
int getBufferSizeMs();
8484

85-
/** Sets the buffer size in samples.*/
86-
void setBufferSize(int);
85+
/** Saves all audio settings that can be loaded to an XML element */
86+
void saveStateToXml(XmlElement* parent);
87+
88+
/** Loads all possible settings from an XML element */
89+
void loadStateFromXml(XmlElement* parent);
8790

8891
AudioDeviceManager deviceManager;
8992

Source/UI/EditorViewport.cpp

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,7 +1299,7 @@ const String EditorViewport::saveState(File fileToUse, String* xmlText)
12991299

13001300
XmlElement* audioSettings = new XmlElement("AUDIO");
13011301

1302-
audioSettings->setAttribute("bufferSize", AccessClass::getAudioComponent()->getBufferSize());
1302+
AccessClass::getAudioComponent()->saveStateToXml(audioSettings);
13031303
xml->addChildElement(audioSettings);
13041304

13051305
XmlElement* recordSettings = new XmlElement("RECORDING");
@@ -1566,9 +1566,8 @@ const String EditorViewport::loadState(File fileToLoad)
15661566
}
15671567
else if (element->hasTagName("AUDIO"))
15681568
{
1569-
int bufferSize = element->getIntAttribute("bufferSize");
1570-
AccessClass::getAudioComponent()->setBufferSize(bufferSize);
1571-
}
1569+
AccessClass::getAudioComponent()->loadStateFromXml(element);
1570+
}
15721571
else if (element->hasTagName("RECORDING"))
15731572
{
15741573
bool recordThreadStatus = element->getBoolAttribute("isRecordThreadEnabled");

0 commit comments

Comments
 (0)