diff --git a/src/add-ons/kernel/drivers/audio/echo/echo.cpp b/src/add-ons/kernel/drivers/audio/echo/echo.cpp index 700dcd2712..af8763d56e 100644 --- a/src/add-ons/kernel/drivers/audio/echo/echo.cpp +++ b/src/add-ons/kernel/drivers/audio/echo/echo.cpp @@ -204,6 +204,9 @@ echo_stream_set_audioparms(echo_stream *stream, uint8 channels, PRINT((" status: %s \n", pStatusStrs[status])); return B_ERROR; } + + if (bitsPerSample == 24) + bitsPerSample = 32; if ((stream->channels == channels) && (stream->bitsPerSample == bitsPerSample) && diff --git a/src/add-ons/media/media-add-ons/mixer/MixerCore.cpp b/src/add-ons/media/media-add-ons/mixer/MixerCore.cpp index 9667d94e11..70bfcd0052 100644 --- a/src/add-ons/media/media-add-ons/mixer/MixerCore.cpp +++ b/src/add-ons/media/media-add-ons/mixer/MixerCore.cpp @@ -263,8 +263,7 @@ MixerCore::ApplyOutputFormat() fResampler = new Resampler * [fMixBufferChannelCount]; for (int i = 0; i < fMixBufferChannelCount; i++) fResampler[i] = new Resampler(media_raw_audio_format::B_AUDIO_FLOAT, - format.format, - format.valid_bits); + format.format); TRACE("MixerCore::OutputFormatChanged:\n"); TRACE(" fMixBufferFrameRate %ld\n", fMixBufferFrameRate); diff --git a/src/add-ons/media/media-add-ons/mixer/MixerInput.cpp b/src/add-ons/media/media-add-ons/mixer/MixerInput.cpp index b3a4a29080..c10e7d84ef 100644 --- a/src/add-ons/media/media-add-ons/mixer/MixerInput.cpp +++ b/src/add-ons/media/media-add-ons/mixer/MixerInput.cpp @@ -67,7 +67,7 @@ MixerInput::MixerInput(MixerCore *core, const media_input &input, float mixFrame // create resamplers fResampler = new Resampler * [fInputChannelCount]; for (int i = 0; i < fInputChannelCount; i++) - fResampler[i] = new Resampler(fInput.format.u.raw_audio.format, media_raw_audio_format::B_AUDIO_FLOAT, 0); + fResampler[i] = new Resampler(fInput.format.u.raw_audio.format, media_raw_audio_format::B_AUDIO_FLOAT); // fMixerChannelInfo and fMixerChannelCount will be initialized by UpdateInputChannelDestinations() SetMixBufferFormat((int32)mixFrameRate, mixFrameCount); diff --git a/src/add-ons/media/media-add-ons/mixer/Resampler.cpp b/src/add-ons/media/media-add-ons/mixer/Resampler.cpp index 18a7d1faea..2aa78a65b7 100644 --- a/src/add-ons/media/media-add-ons/mixer/Resampler.cpp +++ b/src/add-ons/media/media-add-ons/mixer/Resampler.cpp @@ -13,7 +13,7 @@ #include "Resampler.h" #include "MixerDebug.h" -Resampler::Resampler(uint32 src_format, uint32 dst_format, int16 dst_valid_bits) +Resampler::Resampler(uint32 src_format, uint32 dst_format) : fFunc(0) { if (dst_format == media_raw_audio_format::B_AUDIO_FLOAT) { @@ -43,11 +43,7 @@ Resampler::Resampler(uint32 src_format, uint32 dst_format, int16 dst_valid_bits) switch (dst_format) { // float=>float already handled above case media_raw_audio_format::B_AUDIO_INT: - fFunc = &Resampler::float_to_int32_32; - if (dst_valid_bits == 24) - fFunc = &Resampler::float_to_int32_24; - else if (dst_valid_bits == 20) - fFunc = &Resampler::float_to_int32_20; + fFunc = &Resampler::float_to_int32; return; case media_raw_audio_format::B_AUDIO_SHORT: fFunc = &Resampler::float_to_int16; @@ -308,7 +304,7 @@ Resampler::uint8_to_float(const void *_src, int32 src_sample_offset, int32 src_s } void -Resampler::float_to_int32_32(const void *_src, int32 src_sample_offset, int32 src_sample_count, +Resampler::float_to_int32(const void *_src, int32 src_sample_offset, int32 src_sample_count, void *_dst, int32 dst_sample_offset, int32 dst_sample_count, float _gain) { register const char * src = (const char *) _src; @@ -372,136 +368,6 @@ Resampler::float_to_int32_32(const void *_src, int32 src_sample_offset, int32 sr } -void -Resampler::float_to_int32_24(const void *_src, int32 src_sample_offset, int32 src_sample_count, - void *_dst, int32 dst_sample_offset, int32 dst_sample_count, float _gain) -{ - register const char * src = (const char *) _src; - register char * dst = (char *) _dst; - register int32 count = dst_sample_count; - register float gain = _gain * 8388607.0; - - if (src_sample_count == dst_sample_count) { - // optimized case for no resampling - while (count--) { - register float sample = *(const float *)src * gain; - if (sample > 8388607.0f) - *(int32 *)dst = 8388607L; - else if (sample < -8388607.0f) - *(int32 *)dst = -8388607L; - else - *(int32 *)dst = (int32)sample; - src += src_sample_offset; - dst += dst_sample_offset; - } - return; - } - - register float delta = float(src_sample_count) / float(dst_sample_count); - register float current = 0.0f; - - if (delta < 1.0) { - // upsample - while (count--) { - register float sample = *(const float *)src * gain; - if (sample > 8388607.0f) - *(int32 *)dst = 8388607L; - else if (sample < -8388607.0f) - *(int32 *)dst = -8388607L; - else - *(int32 *)dst = (int32)sample; - dst += dst_sample_offset; - current += delta; - if (current >= 1.0f) { - current -= 1.0f; - src += src_sample_offset; - } - } - } else { - // downsample - while (count--) { - register float sample = *(const float *)src * gain; - if (sample > 8388607.0f) - *(int32 *)dst = 8388607L; - else if (sample < -8388607.0f) - *(int32 *)dst = -8388607L; - else - *(int32 *)dst = (int32)sample; - dst += dst_sample_offset; - current += delta; - register int32 skipcount = (int32)current; - current -= skipcount; - src += skipcount * src_sample_offset; - } - } -} - - -void -Resampler::float_to_int32_20(const void *_src, int32 src_sample_offset, int32 src_sample_count, - void *_dst, int32 dst_sample_offset, int32 dst_sample_count, float _gain) -{ - register const char * src = (const char *) _src; - register char * dst = (char *) _dst; - register int32 count = dst_sample_count; - register float gain = _gain * 524287.0; - - if (src_sample_count == dst_sample_count) { - // optimized case for no resampling - while (count--) { - register float sample = *(const float *)src * gain; - if (sample > 524287.0f) - *(int32 *)dst = 524287L; - else if (sample < -524287.0f) - *(int32 *)dst = -524287L; - else - *(int32 *)dst = (int32)sample; - src += src_sample_offset; - dst += dst_sample_offset; - } - return; - } - - register float delta = float(src_sample_count) / float(dst_sample_count); - register float current = 0.0f; - - if (delta < 1.0) { - // upsample - while (count--) { - register float sample = *(const float *)src * gain; - if (sample > 524287.0f) - *(int32 *)dst = 524287L; - else if (sample < -524287.0f) - *(int32 *)dst = -524287L; - else - *(int32 *)dst = (int32)sample; - dst += dst_sample_offset; - current += delta; - if (current >= 1.0f) { - current -= 1.0f; - src += src_sample_offset; - } - } - } else { - // downsample - while (count--) { - register float sample = *(const float *)src * gain; - if (sample > 524287.0f) - *(int32 *)dst = 524287L; - else if (sample < -524287.0f) - *(int32 *)dst = -524287L; - else - *(int32 *)dst = (int32)sample; - dst += dst_sample_offset; - current += delta; - register int32 skipcount = (int32)current; - current -= skipcount; - src += skipcount * src_sample_offset; - } - } -} - - void Resampler::float_to_int16(const void *_src, int32 src_sample_offset, int32 src_sample_count, void *_dst, int32 dst_sample_offset, int32 dst_sample_count, float _gain) diff --git a/src/add-ons/media/media-add-ons/mixer/Resampler.h b/src/add-ons/media/media-add-ons/mixer/Resampler.h index 49b04f822f..09fa110369 100644 --- a/src/add-ons/media/media-add-ons/mixer/Resampler.h +++ b/src/add-ons/media/media-add-ons/mixer/Resampler.h @@ -14,7 +14,7 @@ class Resampler { public: - Resampler(uint32 sourceformat, uint32 destformat, int16 dst_valid_bits); + Resampler(uint32 sourceformat, uint32 destformat); virtual ~Resampler(); status_t InitCheck(); @@ -33,11 +33,7 @@ protected: void *dst, int32 dst_sample_offset, int32 dst_sample_count, float gain); virtual void uint8_to_float (const void *src, int32 src_sample_offset, int32 src_sample_count, void *dst, int32 dst_sample_offset, int32 dst_sample_count, float gain); - virtual void float_to_int32_32 (const void *src, int32 src_sample_offset, int32 src_sample_count, - void *dst, int32 dst_sample_offset, int32 dst_sample_count, float gain); - virtual void float_to_int32_24 (const void *src, int32 src_sample_offset, int32 src_sample_count, - void *dst, int32 dst_sample_offset, int32 dst_sample_count, float gain); - virtual void float_to_int32_20 (const void *src, int32 src_sample_offset, int32 src_sample_count, + virtual void float_to_int32 (const void *src, int32 src_sample_offset, int32 src_sample_count, void *dst, int32 dst_sample_offset, int32 dst_sample_count, float gain); virtual void float_to_int16 (const void *src, int32 src_sample_offset, int32 src_sample_count, void *dst, int32 dst_sample_offset, int32 dst_sample_count, float gain);