|
|
@@ -320,9 +320,9 @@ public: |
|
|
|
classId (clsID),
|
|
|
|
inputLatency (0),
|
|
|
|
outputLatency (0),
|
|
|
|
minSize (0), maxSize (0),
|
|
|
|
preferredSize (0),
|
|
|
|
granularity (0),
|
|
|
|
minBufferSize (0), maxBufferSize (0),
|
|
|
|
preferredBufferSize (0),
|
|
|
|
bufferGranularity (0),
|
|
|
|
numClockSources (0),
|
|
|
|
currentBlockSizeSamples (0),
|
|
|
|
currentBitDepth (16),
|
|
|
@@ -403,7 +403,7 @@ public: |
|
|
|
|
|
|
|
Array<double> getAvailableSampleRates() override { return sampleRates; }
|
|
|
|
Array<int> getAvailableBufferSizes() override { return bufferSizes; }
|
|
|
|
int getDefaultBufferSize() override { return preferredSize; }
|
|
|
|
int getDefaultBufferSize() override { return preferredBufferSize; }
|
|
|
|
|
|
|
|
String open (const BigInteger& inputChannels,
|
|
|
|
const BigInteger& outputChannels,
|
|
|
@@ -469,10 +469,10 @@ public: |
|
|
|
removeCurrentDriver();
|
|
|
|
|
|
|
|
loadDriver();
|
|
|
|
const String error (initDriver());
|
|
|
|
String initError = initDriver();
|
|
|
|
|
|
|
|
if (error.isNotEmpty())
|
|
|
|
JUCE_ASIO_LOG ("ASIOInit: " + error);
|
|
|
|
if (initError.isNotEmpty())
|
|
|
|
JUCE_ASIO_LOG ("ASIOInit: " + initError);
|
|
|
|
|
|
|
|
needToReset = false;
|
|
|
|
}
|
|
|
@@ -489,7 +489,7 @@ public: |
|
|
|
|
|
|
|
if (err != ASE_OK)
|
|
|
|
{
|
|
|
|
currentBlockSizeSamples = preferredSize;
|
|
|
|
currentBlockSizeSamples = preferredBufferSize;
|
|
|
|
JUCE_ASIO_LOG_ERROR ("create buffers 2", err);
|
|
|
|
|
|
|
|
asioObject->disposeBuffers();
|
|
|
@@ -561,8 +561,7 @@ public: |
|
|
|
}
|
|
|
|
|
|
|
|
readLatencies();
|
|
|
|
|
|
|
|
asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity);
|
|
|
|
refreshBufferSizes();
|
|
|
|
deviceIsOpen = true;
|
|
|
|
|
|
|
|
JUCE_ASIO_LOG ("starting");
|
|
|
@@ -762,7 +761,7 @@ private: |
|
|
|
Array<double> sampleRates;
|
|
|
|
Array<int> bufferSizes;
|
|
|
|
long inputLatency, outputLatency;
|
|
|
|
long minSize, maxSize, preferredSize, granularity;
|
|
|
|
long minBufferSize, maxBufferSize, preferredBufferSize, bufferGranularity;
|
|
|
|
ASIOClockSource clocks[32];
|
|
|
|
int numClockSources;
|
|
|
|
|
|
|
@@ -829,23 +828,27 @@ private: |
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
int readBufferSizes (int bufferSizeSamples)
|
|
|
|
long refreshBufferSizes()
|
|
|
|
{
|
|
|
|
minSize = 0;
|
|
|
|
maxSize = 0;
|
|
|
|
granularity = 0;
|
|
|
|
return asioObject->getBufferSize (&minBufferSize, &maxBufferSize, &preferredBufferSize, &bufferGranularity);
|
|
|
|
}
|
|
|
|
|
|
|
|
int readBufferSizes (int bufferSizeSamples)
|
|
|
|
{
|
|
|
|
minBufferSize = 0;
|
|
|
|
maxBufferSize = 0;
|
|
|
|
bufferGranularity = 0;
|
|
|
|
long newPreferredSize = 0;
|
|
|
|
|
|
|
|
if (asioObject->getBufferSize (&minSize, &maxSize, &newPreferredSize, &granularity) == ASE_OK)
|
|
|
|
if (asioObject->getBufferSize (&minBufferSize, &maxBufferSize, &newPreferredBufferSize, &bufferGranularity) == ASE_OK)
|
|
|
|
{
|
|
|
|
if (preferredSize != 0 && newPreferredSize != 0 && newPreferredSize != preferredSize)
|
|
|
|
if (preferredBufferSize != 0 && newPreferredSize != 0 && newPreferredSize != preferredBufferSize)
|
|
|
|
shouldUsePreferredSize = true;
|
|
|
|
|
|
|
|
if (bufferSizeSamples < minSize || bufferSizeSamples > maxSize)
|
|
|
|
if (bufferSizeSamples < minBufferSize || bufferSizeSamples > maxBufferSize)
|
|
|
|
shouldUsePreferredSize = true;
|
|
|
|
|
|
|
|
preferredSize = newPreferredSize;
|
|
|
|
preferredBufferSize = newPreferredSize;
|
|
|
|
}
|
|
|
|
|
|
|
|
// unfortunate workaround for certain drivers which crash if you make
|
|
|
@@ -855,11 +858,11 @@ private: |
|
|
|
if (shouldUsePreferredSize)
|
|
|
|
{
|
|
|
|
JUCE_ASIO_LOG ("Using preferred size for buffer..");
|
|
|
|
long err = asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity);
|
|
|
|
long err = refreshBufferSizes();
|
|
|
|
|
|
|
|
if (err == ASE_OK)
|
|
|
|
{
|
|
|
|
bufferSizeSamples = (int) preferredSize;
|
|
|
|
bufferSizeSamples = (int) preferredBufferSize;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
@@ -1082,8 +1085,8 @@ private: |
|
|
|
if (i < 2)
|
|
|
|
{
|
|
|
|
// clear the channels that are used with the dummy stuff
|
|
|
|
outputFormat[i].clear (bufferInfos [outputBufferIndex + i].buffers[0], preferredSize);
|
|
|
|
outputFormat[i].clear (bufferInfos [outputBufferIndex + i].buffers[1], preferredSize);
|
|
|
|
outputFormat[i].clear (bufferInfos [outputBufferIndex + i].buffers[0], preferredBufferSize);
|
|
|
|
outputFormat[i].clear (bufferInfos [outputBufferIndex + i].buffers[1], preferredBufferSize);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@@ -1203,9 +1206,9 @@ private: |
|
|
|
inputFormat.calloc (chansToAllocate);
|
|
|
|
outputFormat.calloc (chansToAllocate);
|
|
|
|
|
|
|
|
if ((err = asioObject->getBufferSize (&minSize, &maxSize, &preferredSize, &granularity)) == 0)
|
|
|
|
if ((err = refreshBufferSizes()) == 0)
|
|
|
|
{
|
|
|
|
addBufferSizes (minSize, maxSize, preferredSize, granularity);
|
|
|
|
addBufferSizes (minBufferSize, maxBufferSize, preferredBufferSize, bufferGranularity);
|
|
|
|
|
|
|
|
double currentRate = getSampleRate();
|
|
|
|
|
|
|
@@ -1226,8 +1229,8 @@ private: |
|
|
|
|
|
|
|
updateSampleRates();
|
|
|
|
|
|
|
|
readLatencies(); // ..doing these steps because cubase does so at this stage
|
|
|
|
createDummyBuffers (preferredSize); // in initialisation, and some devices fail if we don't.
|
|
|
|
readLatencies(); // ..doing these steps because cubase does so at this stage
|
|
|
|
createDummyBuffers (preferredBufferSize); // in initialisation, and some devices fail if we don't.
|
|
|
|
readLatencies();
|
|
|
|
|
|
|
|
// start and stop because cubase does it..
|
|
|
|