diff --git a/modules/juce_audio_devices/native/juce_linux_ALSA.cpp b/modules/juce_audio_devices/native/juce_linux_ALSA.cpp index b3eb21dd7b..84432055a6 100644 --- a/modules/juce_audio_devices/native/juce_linux_ALSA.cpp +++ b/modules/juce_audio_devices/native/juce_linux_ALSA.cpp @@ -241,7 +241,8 @@ public: (type & isFloatBit) != 0, (type & isLittleEndianBit) != 0, (type & onlyUseLower24Bits) != 0, - numChannels); + numChannels, + isInterleaved); break; } } @@ -393,44 +394,55 @@ private: template struct ConverterHelper { - static AudioData::Converter* createConverter (const bool forInput, const bool isLittleEndian, const int numInterleavedChannels) + static AudioData::Converter* createConverter (const bool forInput, const bool isLittleEndian, const int numInterleavedChannels, bool interleaved) + { + if (interleaved) + return create (forInput, isLittleEndian, numInterleavedChannels); + + return create (forInput, isLittleEndian, numInterleavedChannels); + } + + private: + template + static AudioData::Converter* create (const bool forInput, const bool isLittleEndian, const int numInterleavedChannels) { if (forInput) { typedef AudioData::Pointer DestType; if (isLittleEndian) - return new AudioData::ConverterInstance , DestType> (numInterleavedChannels, 1); + return new AudioData::ConverterInstance , DestType> (numInterleavedChannels, 1); - return new AudioData::ConverterInstance , DestType> (numInterleavedChannels, 1); + return new AudioData::ConverterInstance , DestType> (numInterleavedChannels, 1); } typedef AudioData::Pointer SourceType; if (isLittleEndian) - return new AudioData::ConverterInstance > (1, numInterleavedChannels); + return new AudioData::ConverterInstance > (1, numInterleavedChannels); - return new AudioData::ConverterInstance > (1, numInterleavedChannels); + return new AudioData::ConverterInstance > (1, numInterleavedChannels); } }; static AudioData::Converter* createConverter (bool forInput, int bitDepth, bool isFloat, bool isLittleEndian, bool useOnlyLower24Bits, - int numInterleavedChannels) + int numInterleavedChannels, + bool interleaved) { JUCE_ALSA_LOG ("format: bitDepth=" << bitDepth << ", isFloat=" << (int) isFloat << ", isLittleEndian=" << (int) isLittleEndian << ", numChannels=" << numInterleavedChannels); - if (isFloat) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); - if (bitDepth == 16) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); - if (bitDepth == 24) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); + if (isFloat) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels, interleaved); + if (bitDepth == 16) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels, interleaved); + if (bitDepth == 24) return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels, interleaved); jassert (bitDepth == 32); if (useOnlyLower24Bits) - return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); + return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels, interleaved); - return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels); + return ConverterHelper ::createConverter (forInput, isLittleEndian, numInterleavedChannels, interleaved); } //==============================================================================