mirror of
https://github.com/Relintai/sdl2_frt.git
synced 2024-12-25 09:17:12 +01:00
audio: Converter now checks a strict list of channels and formats we support.
This commit is contained in:
parent
553b328664
commit
a509719fc3
@ -700,6 +700,47 @@ SDL_BuildAudioResampleCVT(SDL_AudioCVT * cvt, const int dst_channels,
|
||||
return 1; /* added a converter. */
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
SDL_SupportedAudioFormat(const SDL_AudioFormat fmt)
|
||||
{
|
||||
switch (fmt) {
|
||||
case AUDIO_U8:
|
||||
case AUDIO_S8:
|
||||
case AUDIO_U16LSB:
|
||||
case AUDIO_S16LSB:
|
||||
case AUDIO_U16MSB:
|
||||
case AUDIO_S16MSB:
|
||||
case AUDIO_S32LSB:
|
||||
case AUDIO_S32MSB:
|
||||
case AUDIO_F32LSB:
|
||||
case AUDIO_F32MSB:
|
||||
return SDL_TRUE; /* supported. */
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return SDL_FALSE; /* unsupported. */
|
||||
}
|
||||
|
||||
static SDL_bool
|
||||
SDL_SupportedChannelCount(const int channels)
|
||||
{
|
||||
switch (channels) {
|
||||
case 1: /* mono */
|
||||
case 2: /* stereo */
|
||||
case 4: /* quad */
|
||||
case 6: /* 5.1 */
|
||||
return SDL_TRUE; /* supported. */
|
||||
|
||||
case 8: /* !!! FIXME: 7.1 */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return SDL_FALSE; /* unsupported. */
|
||||
}
|
||||
|
||||
|
||||
/* Creates a set of audio filters to convert from one format to another.
|
||||
Returns -1 if the format conversion is not supported, 0 if there's
|
||||
@ -719,21 +760,20 @@ SDL_BuildAudioCVT(SDL_AudioCVT * cvt,
|
||||
/* Make sure we zero out the audio conversion before error checking */
|
||||
SDL_zerop(cvt);
|
||||
|
||||
/* there are no unsigned types over 16 bits, so catch this up front. */
|
||||
if ((SDL_AUDIO_BITSIZE(src_fmt) > 16) && (!SDL_AUDIO_ISSIGNED(src_fmt))) {
|
||||
if (!SDL_SupportedAudioFormat(src_fmt)) {
|
||||
return SDL_SetError("Invalid source format");
|
||||
}
|
||||
if ((SDL_AUDIO_BITSIZE(dst_fmt) > 16) && (!SDL_AUDIO_ISSIGNED(dst_fmt))) {
|
||||
} else if (!SDL_SupportedAudioFormat(dst_fmt)) {
|
||||
return SDL_SetError("Invalid destination format");
|
||||
} else if (!SDL_SupportedChannelCount(src_channels)) {
|
||||
return SDL_SetError("Invalid source channels");
|
||||
} else if (!SDL_SupportedChannelCount(dst_channels)) {
|
||||
return SDL_SetError("Invalid destination channels");
|
||||
} else if (src_rate == 0) {
|
||||
return SDL_SetError("Source rate is zero");
|
||||
} else if (dst_rate == 0) {
|
||||
return SDL_SetError("Destination rate is zero");
|
||||
}
|
||||
|
||||
/* prevent possible divisions by zero, etc. */
|
||||
if ((src_channels == 0) || (dst_channels == 0)) {
|
||||
return SDL_SetError("Source or destination channels is zero");
|
||||
}
|
||||
if ((src_rate == 0) || (dst_rate == 0)) {
|
||||
return SDL_SetError("Source or destination rate is zero");
|
||||
}
|
||||
#if DEBUG_CONVERT
|
||||
printf("Build format %04x->%04x, channels %u->%u, rate %d->%d\n",
|
||||
src_fmt, dst_fmt, src_channels, dst_channels, src_rate, dst_rate);
|
||||
|
Loading…
Reference in New Issue
Block a user