| | |
| | | /* |
| | | Simple DirectMedia Layer |
| | | Copyright (C) 1997-2018 Sam Lantinga <slouken@libsdl.org> |
| | | Copyright (C) 1997-2020 Sam Lantinga <slouken@libsdl.org> |
| | | |
| | | This software is provided 'as-is', without any express or implied |
| | | warranty. In no event will the authors be held liable for any damages |
| | |
| | | } |
| | | |
| | | if (!filter) { |
| | | return SDL_SetError("No conversion from float to destination format available"); |
| | | return SDL_SetError("No conversion from float to format 0x%.4x available", dst_fmt); |
| | | } |
| | | |
| | | if (SDL_AddAudioCVTFilter(cvt, filter) < 0) { |
| | |
| | | /* !!! FIXME: remove this if we can get the resampler to work in-place again. */ |
| | | float *dst = (float *) (cvt->buf + srclen); |
| | | const int dstlen = (cvt->len * cvt->len_mult) - srclen; |
| | | const int paddingsamples = (ResamplerPadding(inrate, outrate) * chans); |
| | | const int requestedpadding = ResamplerPadding(inrate, outrate); |
| | | int paddingsamples; |
| | | float *padding; |
| | | |
| | | if (requestedpadding < SDL_MAX_SINT32 / chans) { |
| | | paddingsamples = requestedpadding * chans; |
| | | } else { |
| | | paddingsamples = 0; |
| | | } |
| | | SDL_assert(format == AUDIO_F32SYS); |
| | | |
| | | /* we keep no streaming state here, so pad with silence on both ends. */ |
| | |
| | | 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"); |
| | | } else if (src_rate <= 0) { |
| | | return SDL_SetError("Source rate is equal to or less than zero"); |
| | | } else if (dst_rate <= 0) { |
| | | return SDL_SetError("Destination rate is equal to or less than zero"); |
| | | } else if (src_rate >= SDL_MAX_SINT32 / RESAMPLER_SAMPLES_PER_ZERO_CROSSING) { |
| | | return SDL_SetError("Source rate is too high"); |
| | | } else if (dst_rate >= SDL_MAX_SINT32 / RESAMPLER_SAMPLES_PER_ZERO_CROSSING) { |
| | | return SDL_SetError("Destination rate is too high"); |
| | | } |
| | | |
| | | #if DEBUG_CONVERT |
| | |
| | | cvt->dst_format = dst_fmt; |
| | | cvt->needed = 0; |
| | | cvt->filter_index = 0; |
| | | SDL_zero(cvt->filters); |
| | | SDL_zeroa(cvt->filters); |
| | | cvt->len_mult = 1; |
| | | cvt->len_ratio = 1.0; |
| | | cvt->rate_incr = ((double) dst_rate) / ((double) src_rate); |