@@ -646,6 +646,24 @@ namespace WavFileHelpers | |||||
return true; | return true; | ||||
} | } | ||||
static String getStringFromWindows1252Codepage (const uint8* data, size_t num) | |||||
{ | |||||
HeapBlock<juce_wchar> unicode (num + 1); | |||||
for (size_t i = 0; i < num; ++i) | |||||
unicode[i] = CharacterFunctions::getUnicodeCharFromWindows1252Codepage (data[i]); | |||||
unicode[num] = 0; | |||||
return CharPointer_UTF32 (unicode); | |||||
} | |||||
static String getStringFromData (const MemoryBlock& mb) | |||||
{ | |||||
return CharPointer_UTF8::isValidString ((const char*) mb.getData(), mb.getSize()) | |||||
? mb.toString() | |||||
: getStringFromWindows1252Codepage ((const uint8*) mb.getData(), mb.getSize()); | |||||
} | |||||
static void addToMetadata (StringPairArray& values, InputStream& input, int64 chunkEnd) | static void addToMetadata (StringPairArray& values, InputStream& input, int64 chunkEnd) | ||||
{ | { | ||||
while (input.getPosition() < chunkEnd) | while (input.getPosition() < chunkEnd) | ||||
@@ -664,7 +682,7 @@ namespace WavFileHelpers | |||||
{ | { | ||||
MemoryBlock mb; | MemoryBlock mb; | ||||
input.readIntoMemoryBlock (mb, (ssize_t) infoLength); | input.readIntoMemoryBlock (mb, (ssize_t) infoLength); | ||||
values.set (types[i], mb.toString()); | |||||
values.set (types[i], getStringFromData (mb)); | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -162,3 +162,16 @@ double CharacterFunctions::mulexp10 (const double value, int exponent) noexcept | |||||
return negative ? (value / result) : (value * result); | return negative ? (value / result) : (value * result); | ||||
} | } | ||||
juce_wchar CharacterFunctions::getUnicodeCharFromWindows1252Codepage (const uint8 c) noexcept | |||||
{ | |||||
if (c < 0x80 || c >= 0xa0) | |||||
return (juce_wchar) c; | |||||
static const uint16 lookup[] = { 0x20AC, 0x0007, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, | |||||
0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0007, 0x017D, 0x0007, | |||||
0x0007, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, | |||||
0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0007, 0x017E, 0x0178 }; | |||||
return (juce_wchar) lookup[c - 0x80]; | |||||
} |
@@ -123,6 +123,9 @@ public: | |||||
/** Returns 0 to 16 for '0' to 'F", or -1 for characters that aren't a legal hex digit. */ | /** Returns 0 to 16 for '0' to 'F", or -1 for characters that aren't a legal hex digit. */ | ||||
static int getHexDigitValue (juce_wchar digit) noexcept; | static int getHexDigitValue (juce_wchar digit) noexcept; | ||||
/** Converts a byte of Windows 1252 codepage to unicode. */ | |||||
static juce_wchar getUnicodeCharFromWindows1252Codepage (uint8 windows1252Char) noexcept; | |||||
//============================================================================== | //============================================================================== | ||||
/** Parses a character string to read a floating-point number. | /** Parses a character string to read a floating-point number. | ||||
Note that this will advance the pointer that is passed in, leaving it at | Note that this will advance the pointer that is passed in, leaving it at | ||||