| @@ -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.. | |||