From ff14d2457aff9cf4b08cb8d7765c1bbc450c2ba4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 6 Feb 2006 17:56:48 +0000 Subject: [PATCH] * mixer media addon builds on beos, fixed includes missing * added 24 bits B_AUDIO_INT support (20 bits still missing) Marcus please review and fix if needed git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16253 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/add-ons/media/media-add-ons/mixer/Jamfile | 2 + .../media/media-add-ons/mixer/MixerCore.cpp | 2 +- .../media/media-add-ons/mixer/MixerCore.h | 2 + .../media/media-add-ons/mixer/MixerInput.cpp | 2 +- .../media/media-add-ons/mixer/MixerSettings.h | 1 + .../media/media-add-ons/mixer/MixerUtils.h | 2 + .../media/media-add-ons/mixer/Resampler.cpp | 76 ++++++++++++++++++- .../media/media-add-ons/mixer/Resampler.h | 6 +- 8 files changed, 86 insertions(+), 7 deletions(-) diff --git a/src/add-ons/media/media-add-ons/mixer/Jamfile b/src/add-ons/media/media-add-ons/mixer/Jamfile index d6781a36d0..9d4d1b3a40 100644 --- a/src/add-ons/media/media-add-ons/mixer/Jamfile +++ b/src/add-ons/media/media-add-ons/mixer/Jamfile @@ -1,5 +1,7 @@ SubDir HAIKU_TOP src add-ons media media-add-ons mixer ; +SetSubDirSupportedPlatformsBeOSCompatible ; + UsePrivateHeaders media ; Addon mixer.media_addon : media : 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 8445ae16c7..49c4e4bda4 100644 --- a/src/add-ons/media/media-add-ons/mixer/MixerCore.cpp +++ b/src/add-ons/media/media-add-ons/mixer/MixerCore.cpp @@ -257,7 +257,7 @@ MixerCore::ApplyOutputFormat() // create new resamplers fResampler = new Resampler * [fMixBufferChannelCount]; for (int i = 0; i < fMixBufferChannelCount; i++) - fResampler[i] = new Resampler(media_raw_audio_format::B_AUDIO_FLOAT, format.format); + fResampler[i] = new Resampler(media_raw_audio_format::B_AUDIO_FLOAT, format.format, format.valid_bits); TRACE("MixerCore::OutputFormatChanged:\n"); TRACE(" fMixBufferFrameRate %ld\n", fMixBufferFrameRate); diff --git a/src/add-ons/media/media-add-ons/mixer/MixerCore.h b/src/add-ons/media/media-add-ons/mixer/MixerCore.h index 83c9e3514d..6b33bf764b 100644 --- a/src/add-ons/media/media-add-ons/mixer/MixerCore.h +++ b/src/add-ons/media/media-add-ons/mixer/MixerCore.h @@ -1,7 +1,9 @@ #ifndef _MIXER_CORE_H #define _MIXER_CORE_H +#include #include +#include #include "MixerSettings.h" class AudioMixer; 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 a028d7360d..3be408c28d 100644 --- a/src/add-ons/media/media-add-ons/mixer/MixerInput.cpp +++ b/src/add-ons/media/media-add-ons/mixer/MixerInput.cpp @@ -60,7 +60,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); + fResampler[i] = new Resampler(fInput.format.u.raw_audio.format, media_raw_audio_format::B_AUDIO_FLOAT, 0); // fMixerChannelInfo and fMixerChannelCount will be initialized by UpdateInputChannelDestinations() diff --git a/src/add-ons/media/media-add-ons/mixer/MixerSettings.h b/src/add-ons/media/media-add-ons/mixer/MixerSettings.h index ab2884c107..c078e96677 100644 --- a/src/add-ons/media/media-add-ons/mixer/MixerSettings.h +++ b/src/add-ons/media/media-add-ons/mixer/MixerSettings.h @@ -2,6 +2,7 @@ #define _MIXER_SETTINGS_H #include +#include class MixerInput; class MixerOutput; diff --git a/src/add-ons/media/media-add-ons/mixer/MixerUtils.h b/src/add-ons/media/media-add-ons/mixer/MixerUtils.h index 23f7c41884..39e70ab0fd 100644 --- a/src/add-ons/media/media-add-ons/mixer/MixerUtils.h +++ b/src/add-ons/media/media-add-ons/mixer/MixerUtils.h @@ -7,8 +7,10 @@ #define PRINT_CHANNEL_MASK(fmt) ((void)0) #endif +#ifndef __SGI_STL_INTERNAL_ALGOBASE_H template const t & max(const t &t1, const t &t2) { return (t1 > t2) ? t1 : t2; } template const t & min(const t &t1, const t &t2) { return (t1 < t2) ? t1 : t2; } +#endif template const t abs(const t t1) { return (t1 < 0) ? - t1 : t1; } void fix_multiaudio_format(media_multi_audio_format *format); 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 a048738336..4599cb658d 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 "debug.h" -Resampler::Resampler(uint32 src_format, uint32 dst_format) +Resampler::Resampler(uint32 src_format, uint32 dst_format, int16 dst_valid_bits) : fFunc(0) { if (dst_format == media_raw_audio_format::B_AUDIO_FLOAT) { @@ -43,7 +43,11 @@ Resampler::Resampler(uint32 src_format, uint32 dst_format) switch (dst_format) { // float=>float already handled above case media_raw_audio_format::B_AUDIO_INT: - fFunc = &Resampler::float_to_int32; + fFunc = &Resampler::float_to_int32_32; + if (dst_valid_bits == 24) + fFunc = &Resampler::float_to_int32_24; + //if (dst_valid_bits == 20) + // fFunc = &Resampler::float_to_int32_20; return; case media_raw_audio_format::B_AUDIO_SHORT: fFunc = &Resampler::float_to_int16; @@ -304,7 +308,7 @@ Resampler::uint8_to_float(const void *_src, int32 src_sample_offset, int32 src_s } void -Resampler::float_to_int32(const void *_src, int32 src_sample_offset, int32 src_sample_count, +Resampler::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) { register const char * src = (const char *) _src; @@ -367,6 +371,72 @@ Resampler::float_to_int32(const void *_src, int32 src_sample_offset, int32 src_s } } + +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 < -2147483647.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_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 eaf850ac06..35e39d5b7b 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); + Resampler(uint32 sourceformat, uint32 destformat, int16 dst_valid_bits); virtual ~Resampler(); status_t InitCheck(); @@ -33,7 +33,9 @@ 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 (const void *src, int32 src_sample_offset, int32 src_sample_count, + 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_int16 (const void *src, int32 src_sample_offset, int32 src_sample_count, void *dst, int32 dst_sample_offset, int32 dst_sample_count, float gain);