mirror of
https://github.com/mackron/miniaudio.git
synced 2026-04-22 00:06:59 +02:00
audio(4): Make format encoding stuff more robust.
This commit is contained in:
+94
-35
@@ -41223,26 +41223,65 @@ static void ma_construct_device_id__audio4(char* id, size_t idSize, const char*
|
||||
|
||||
static ma_format ma_format_from_encoding__audio4(unsigned int encoding, unsigned int precision)
|
||||
{
|
||||
if (precision == 8 && (encoding == AUDIO_ENCODING_ULINEAR || encoding == AUDIO_ENCODING_ULINEAR || encoding == AUDIO_ENCODING_ULINEAR_LE || encoding == AUDIO_ENCODING_ULINEAR_BE)) {
|
||||
return ma_format_u8;
|
||||
if (precision == 8) {
|
||||
switch (encoding)
|
||||
{
|
||||
#if defined(AUDIO_ENCODING_LINEAR8)
|
||||
case AUDIO_ENCODING_LINEAR8: return ma_format_u8;
|
||||
#endif
|
||||
#if defined(AUDIO_ENCODING_ULINEAR)
|
||||
case AUDIO_ENCODING_ULINEAR: return ma_format_u8;
|
||||
#endif
|
||||
#if defined(AUDIO_ENCODING_ULINEAR_LE)
|
||||
case AUDIO_ENCODING_ULINEAR_LE: return ma_format_u8;
|
||||
#endif
|
||||
#if defined(AUDIO_ENCODING_ULINEAR_BE)
|
||||
case AUDIO_ENCODING_ULINEAR_BE: return ma_format_u8;
|
||||
#endif
|
||||
default: return ma_format_unknown;
|
||||
}
|
||||
} else {
|
||||
if (ma_is_little_endian() && encoding == AUDIO_ENCODING_SLINEAR_LE) {
|
||||
if (precision == 16) {
|
||||
return ma_format_s16;
|
||||
} else if (precision == 24) {
|
||||
return ma_format_s24;
|
||||
} else if (precision == 32) {
|
||||
return ma_format_s32;
|
||||
}
|
||||
} else if (ma_is_big_endian() && encoding == AUDIO_ENCODING_SLINEAR_BE) {
|
||||
if (precision == 16) {
|
||||
return ma_format_s16;
|
||||
} else if (precision == 24) {
|
||||
return ma_format_s24;
|
||||
} else if (precision == 32) {
|
||||
return ma_format_s32;
|
||||
#if defined(AUDIO_ENCODING_LINEAR)
|
||||
{
|
||||
if (encoding == AUDIO_ENCODING_LINEAR) { /* Assume native endian. */
|
||||
/* */ if (precision == 16) {
|
||||
return ma_format_s16;
|
||||
} else if (precision == 24) {
|
||||
return ma_format_s24;
|
||||
} else if (precision == 32) {
|
||||
return ma_format_s32;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(AUDIO_ENCODING_SLINEAR_LE)
|
||||
{
|
||||
if (encoding == AUDIO_ENCODING_SLINEAR_LE && ma_is_little_endian()) { /* Explicitly little-endian. Can only be supported on little-endian machines. */
|
||||
/* */ if (precision == 16) {
|
||||
return ma_format_s16;
|
||||
} else if (precision == 24) {
|
||||
return ma_format_s24;
|
||||
} else if (precision == 32) {
|
||||
return ma_format_s32;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#if defined(AUDIO_ENCODING_SLINEAR_BE)
|
||||
{
|
||||
if (encoding == AUDIO_ENCODING_SLINEAR_BE && ma_is_big_endian()) { /* Explicitly big-endian. Can only be supported on big-endian machines. */
|
||||
/* */ if (precision == 16) {
|
||||
return ma_format_s16;
|
||||
} else if (precision == 24) {
|
||||
return ma_format_s24;
|
||||
} else if (precision == 32) {
|
||||
return ma_format_s32;
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
return ma_format_unknown; /* Encoding not supported. */
|
||||
@@ -41253,32 +41292,52 @@ static void ma_encoding_from_format__audio4(ma_format format, unsigned int* pEnc
|
||||
MA_ASSERT(pEncoding != NULL);
|
||||
MA_ASSERT(pPrecision != NULL);
|
||||
|
||||
/* Encoding. */
|
||||
if (format == ma_format_u8) {
|
||||
#if defined(AUDIO_ENCODING_ULINEAR)
|
||||
*pEncoding = AUDIO_ENCODING_ULINEAR;
|
||||
#elif defined(AUDIO_ENCODING_LINEAR8)
|
||||
*pEncoding = AUDIO_ENCODING_LINEAR8;
|
||||
#else
|
||||
#error "Don't know how to encode format."
|
||||
#endif
|
||||
} else {
|
||||
#if defined(AUDIO_ENCODING_LINEAR)
|
||||
*pEncoding = AUDIO_ENCODING_LINEAR;
|
||||
#else
|
||||
{
|
||||
if (ma_is_little_endian()) {
|
||||
#if defined(AUDIO_ENCODING_SLINEAR_LE)
|
||||
*pEncoding = AUDIO_ENCODING_SLINEAR_LE;
|
||||
#else
|
||||
MA_ASSERT(!"audio(4): Don't know how to set the encoding. This platform cannot use the audio(4) backend. Please submit a bug report.");
|
||||
*pEncoding = 0; /* Don't know how to set the encoding... */
|
||||
#endif
|
||||
} else {
|
||||
#if defined(AUDIO_ENCODING_SLINEAR_LE)
|
||||
*pEncoding = AUDIO_ENCODING_SLINEAR_LE;
|
||||
#else
|
||||
MA_ASSERT(!"audio(4): Don't know how to set the encoding. This platform cannot use the audio(4) backend. Please submit a bug report.");
|
||||
*pEncoding = 0; /* Don't know how to set the encoding... */
|
||||
#endif
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Precision. */
|
||||
switch (format)
|
||||
{
|
||||
case ma_format_u8:
|
||||
{
|
||||
*pEncoding = AUDIO_ENCODING_ULINEAR;
|
||||
*pPrecision = 8;
|
||||
} break;
|
||||
|
||||
case ma_format_s24:
|
||||
{
|
||||
*pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE;
|
||||
*pPrecision = 24;
|
||||
} break;
|
||||
|
||||
case ma_format_s32:
|
||||
{
|
||||
*pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE;
|
||||
*pPrecision = 32;
|
||||
} break;
|
||||
case ma_format_u8: *pPrecision = 8; break;
|
||||
case ma_format_s24: *pPrecision = 24; break;
|
||||
case ma_format_s32: *pPrecision = 32; break;
|
||||
|
||||
/* Default everything else to 16-bit encoding. */
|
||||
case ma_format_s16:
|
||||
case ma_format_f32:
|
||||
case ma_format_unknown:
|
||||
default:
|
||||
{
|
||||
*pEncoding = (ma_is_little_endian()) ? AUDIO_ENCODING_SLINEAR_LE : AUDIO_ENCODING_SLINEAR_BE;
|
||||
*pPrecision = 16;
|
||||
} break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user