mirror of
https://code.videolan.org/videolan/vlc
synced 2024-10-03 01:31:53 +02:00
volume: add direct support for S32N, FL64 and U8
This commit is contained in:
parent
2c22b194c8
commit
f58f22cc31
@ -1,6 +1,11 @@
|
||||
SOURCES_float32_mixer = float32.c
|
||||
SOURCES_integer_mixer = integer.c
|
||||
libfloat_mixer_plugin_la_SOURCES = float.c
|
||||
libfloat_mixer_plugin_la_CFLAGS = $(AM_CFLAGS)
|
||||
libfloat_mixer_plugin_la_LIBADD = $(AM_LIBADD) $(LIBM)
|
||||
|
||||
libinteger_mixer_plugin_la_SOURCES = integer.c
|
||||
libinteger_mixer_plugin_la_CFLAGS = $(AM_CFLAGS)
|
||||
libinteger_mixer_plugin_la_LIBADD = $(AM_LIBADD)
|
||||
|
||||
libvlc_LTLIBRARIES += \
|
||||
libfloat32_mixer_plugin.la \
|
||||
libfloat_mixer_plugin.la \
|
||||
libinteger_mixer_plugin.la
|
||||
|
@ -39,7 +39,6 @@
|
||||
* Local prototypes
|
||||
*****************************************************************************/
|
||||
static int Create( vlc_object_t * );
|
||||
static void DoWork( audio_volume_t *, block_t *, float );
|
||||
|
||||
/*****************************************************************************
|
||||
* Module descriptor
|
||||
@ -52,27 +51,13 @@ vlc_module_begin ()
|
||||
set_callbacks( Create, NULL )
|
||||
vlc_module_end ()
|
||||
|
||||
/**
|
||||
* Initializes the mixer
|
||||
*/
|
||||
static int Create( vlc_object_t *p_this )
|
||||
{
|
||||
audio_volume_t *p_volume = (audio_volume_t *)p_this;
|
||||
|
||||
if (p_volume->format != VLC_CODEC_FL32)
|
||||
return -1;
|
||||
|
||||
p_volume->amplify = DoWork;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* Mixes a new output buffer
|
||||
*/
|
||||
static void DoWork( audio_volume_t *p_volume, block_t *p_buffer,
|
||||
float f_multiplier )
|
||||
static void FilterFL32( audio_volume_t *p_volume, block_t *p_buffer,
|
||||
float f_multiplier )
|
||||
{
|
||||
if( f_multiplier == 1.0 )
|
||||
if( f_multiplier == 1.f )
|
||||
return; /* nothing to do */
|
||||
|
||||
float *p = (float *)p_buffer->p_buffer;
|
||||
@ -81,3 +66,38 @@ static void DoWork( audio_volume_t *p_volume, block_t *p_buffer,
|
||||
|
||||
(void) p_volume;
|
||||
}
|
||||
|
||||
static void FilterFL64( audio_volume_t *p_volume, block_t *p_buffer,
|
||||
float f_multiplier )
|
||||
{
|
||||
double *p = (double *)p_buffer->p_buffer;
|
||||
double mult = f_multiplier;
|
||||
if( mult == 1. )
|
||||
return; /* nothing to do */
|
||||
|
||||
for( size_t i = p_buffer->i_buffer / sizeof(float); i > 0; i-- )
|
||||
*(p++) *= mult;
|
||||
|
||||
(void) p_volume;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initializes the mixer
|
||||
*/
|
||||
static int Create( vlc_object_t *p_this )
|
||||
{
|
||||
audio_volume_t *p_volume = (audio_volume_t *)p_this;
|
||||
|
||||
switch (p_volume->format)
|
||||
{
|
||||
case VLC_CODEC_FL32:
|
||||
p_volume->amplify = FilterFL32;
|
||||
break;
|
||||
case VLC_CODEC_FL64:
|
||||
p_volume->amplify = FilterFL64;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
@ -22,6 +22,9 @@
|
||||
# include "config.h"
|
||||
#endif
|
||||
|
||||
#include <math.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <vlc_common.h>
|
||||
#include <vlc_plugin.h>
|
||||
#include <vlc_aout.h>
|
||||
@ -37,7 +40,74 @@ vlc_module_begin ()
|
||||
set_callbacks (Activate, NULL)
|
||||
vlc_module_end ()
|
||||
|
||||
static void FilterS16N (audio_volume_t *, block_t *, float);
|
||||
static void FilterS32N (audio_volume_t *vol, block_t *block, float volume)
|
||||
{
|
||||
int32_t *p = (int32_t *)block->p_buffer;
|
||||
|
||||
int32_t mult = lroundf (volume * 0x1.p24f);
|
||||
if (mult == (1 << 24))
|
||||
return;
|
||||
|
||||
for (size_t n = block->i_buffer / sizeof (*p); n > 0; n--)
|
||||
{
|
||||
int64_t s = *p * (int64_t)mult;
|
||||
if (s >= (INT32_MAX << INT64_C(24)))
|
||||
*p = INT32_MAX;
|
||||
else
|
||||
if (s < (INT32_MIN << INT64_C(24)))
|
||||
*p = INT32_MIN;
|
||||
else
|
||||
*p = s >> INT64_C(24);
|
||||
p++;
|
||||
}
|
||||
(void) vol;
|
||||
}
|
||||
|
||||
static void FilterS16N (audio_volume_t *vol, block_t *block, float volume)
|
||||
{
|
||||
int16_t *p = (int16_t *)block->p_buffer;
|
||||
|
||||
int16_t mult = lroundf (volume * 0x1.p8f);
|
||||
if (mult == (1 << 8))
|
||||
return;
|
||||
|
||||
for (size_t n = block->i_buffer / sizeof (*p); n > 0; n--)
|
||||
{
|
||||
int32_t s = *p * (int32_t)mult;
|
||||
if (s >= (INT16_MAX << 8))
|
||||
*p = INT16_MAX;
|
||||
else
|
||||
if (s < (INT_MIN << 8))
|
||||
*p = INT16_MIN;
|
||||
else
|
||||
*p = s >> 8;
|
||||
p++;
|
||||
}
|
||||
(void) vol;
|
||||
}
|
||||
|
||||
static void FilterU8 (audio_volume_t *vol, block_t *block, float volume)
|
||||
{
|
||||
uint8_t *p = (uint8_t *)block->p_buffer;
|
||||
|
||||
int16_t mult = lroundf (volume * 0x1.p8f);
|
||||
if (mult == (1 << 8))
|
||||
return;
|
||||
|
||||
for (size_t n = block->i_buffer / sizeof (*p); n > 0; n--)
|
||||
{
|
||||
int32_t s = (*p - 128) * mult;
|
||||
if (s >= (INT8_MAX << 8))
|
||||
*p = 255;
|
||||
else
|
||||
if (s < (INT8_MIN << 8))
|
||||
*p = 0;
|
||||
else
|
||||
*p = (s >> 8) + 128;
|
||||
p++;
|
||||
}
|
||||
(void) vol;
|
||||
}
|
||||
|
||||
static int Activate (vlc_object_t *obj)
|
||||
{
|
||||
@ -45,43 +115,17 @@ static int Activate (vlc_object_t *obj)
|
||||
|
||||
switch (vol->format)
|
||||
{
|
||||
case VLC_CODEC_S32N:
|
||||
vol->amplify = FilterS32N;
|
||||
break;
|
||||
case VLC_CODEC_S16N:
|
||||
vol->amplify = FilterS16N;
|
||||
break;
|
||||
case VLC_CODEC_U8:
|
||||
vol->amplify = FilterU8;
|
||||
break;
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void FilterS16N (audio_volume_t *vol, block_t *block, float volume)
|
||||
{
|
||||
int32_t mult = volume * 0x1.p16;
|
||||
|
||||
if (mult == 0x10000)
|
||||
return;
|
||||
|
||||
int16_t *p = (int16_t *)block->p_buffer;
|
||||
|
||||
if (mult < 0x10000)
|
||||
{
|
||||
for (size_t n = block->i_buffer / sizeof (*p); n > 0; n--)
|
||||
{
|
||||
*p = (*p * mult) >> 16;
|
||||
p++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
mult >>= 4;
|
||||
for (size_t n = block->i_buffer / sizeof (*p); n > 0; n--)
|
||||
{
|
||||
int32_t v = (*p * mult) >> 12;
|
||||
if (abs (v) > 0x7fff)
|
||||
v = 0x8000;
|
||||
*(p++) = v;
|
||||
}
|
||||
}
|
||||
|
||||
(void) vol;
|
||||
}
|
||||
|
@ -318,7 +318,7 @@ modules/audio_filter/spatializer/revmodel.hpp
|
||||
modules/audio_filter/spatializer/spatializer.cpp
|
||||
modules/audio_filter/spatializer/tuning.h
|
||||
modules/audio_filter/stereo_widen.c
|
||||
modules/audio_mixer/float32.c
|
||||
modules/audio_mixer/float.c
|
||||
modules/audio_mixer/integer.c
|
||||
modules/audio_output/adummy.c
|
||||
modules/audio_output/alsa.c
|
||||
|
Loading…
Reference in New Issue
Block a user