Renamed samples in frames where appropriated. Added a compatibility hack for gcc 2.7.2.3

This commit is contained in:
Abramo Bagnara 2000-05-24 21:35:55 +00:00
parent cc5730a49e
commit 9eb2c42445
15 changed files with 365 additions and 361 deletions

View file

@ -79,7 +79,7 @@ typedef struct {
typedef void (*adpcm_f)(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples);
size_t frames);
typedef struct adpcm_private_data {
adpcm_f func;
@ -213,7 +213,7 @@ static int adpcm_decoder(unsigned char code, adpcm_voice_t * state)
static void adpcm_decode(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
#define PUT_S16_LABELS
#include "plugin_ops.h"
@ -227,11 +227,11 @@ static void adpcm_decode(snd_pcm_plugin_t *plugin,
int srcbit;
char *dst;
int src_step, srcbit_step, dst_step;
size_t samples1;
size_t frames1;
adpcm_voice_t *state;
if (!src_voices[voice].enabled) {
if (dst_voices[voice].wanted)
snd_pcm_area_silence(&dst_voices[voice].area, 0, samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voices[voice].area, 0, frames, plugin->dst_format.format);
dst_voices[voice].enabled = 0;
continue;
}
@ -243,8 +243,8 @@ static void adpcm_decode(snd_pcm_plugin_t *plugin,
srcbit_step = src_voices[voice].area.step % 8;
dst_step = dst_voices[voice].area.step / 8;
state = &data->voices[voice];
samples1 = samples;
while (samples1-- > 0) {
frames1 = frames;
while (frames1-- > 0) {
signed short sample;
int v;
if (srcbit)
@ -271,7 +271,7 @@ static void adpcm_decode(snd_pcm_plugin_t *plugin,
static void adpcm_encode(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
#define GET_S16_LABELS
#include "plugin_ops.h"
@ -286,11 +286,11 @@ static void adpcm_encode(snd_pcm_plugin_t *plugin,
char *dst;
int dstbit;
int src_step, dst_step, dstbit_step;
size_t samples1;
size_t frames1;
adpcm_voice_t *state;
if (!src_voices[voice].enabled) {
if (dst_voices[voice].wanted)
snd_pcm_area_silence(&dst_voices[voice].area, 0, samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voices[voice].area, 0, frames, plugin->dst_format.format);
dst_voices[voice].enabled = 0;
continue;
}
@ -302,8 +302,8 @@ static void adpcm_encode(snd_pcm_plugin_t *plugin,
dst_step = dst_voices[voice].area.step / 8;
dstbit_step = dst_voices[voice].area.step % 8;
state = &data->voices[voice];
samples1 = samples;
while (samples1-- > 0) {
frames1 = frames;
while (frames1-- > 0) {
int v;
goto *get;
#define GET_S16_END after
@ -329,14 +329,14 @@ static void adpcm_encode(snd_pcm_plugin_t *plugin,
static ssize_t adpcm_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
adpcm_t *data;
unsigned int voice;
if (plugin == NULL || src_voices == NULL || dst_voices == NULL)
return -EFAULT;
if (samples == 0)
if (frames == 0)
return 0;
for (voice = 0; voice < plugin->src_format.voices; voice++) {
if (plugin->src_format.format == SND_PCM_SFMT_IMA_ADPCM) {
@ -354,8 +354,8 @@ static ssize_t adpcm_transfer(snd_pcm_plugin_t *plugin,
}
}
data = (adpcm_t *)plugin->extra_data;
data->func(plugin, src_voices, dst_voices, samples);
return samples;
data->func(plugin, src_voices, dst_voices, frames);
return frames;
}
static int adpcm_action(snd_pcm_plugin_t * plugin,

View file

@ -135,7 +135,7 @@ static int alaw2linear(unsigned char a_val)
typedef void (*alaw_f)(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples);
size_t frames);
typedef struct alaw_private_data {
alaw_f func;
@ -145,7 +145,7 @@ typedef struct alaw_private_data {
static void alaw_decode(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
#define PUT_S16_LABELS
#include "plugin_ops.h"
@ -158,10 +158,10 @@ static void alaw_decode(snd_pcm_plugin_t *plugin,
char *src;
char *dst;
int src_step, dst_step;
size_t samples1;
size_t frames1;
if (!src_voices[voice].enabled) {
if (dst_voices[voice].wanted)
snd_pcm_area_silence(&dst_voices[voice].area, 0, samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voices[voice].area, 0, frames, plugin->dst_format.format);
dst_voices[voice].enabled = 0;
continue;
}
@ -170,8 +170,8 @@ static void alaw_decode(snd_pcm_plugin_t *plugin,
dst = dst_voices[voice].area.addr + dst_voices[voice].area.first / 8;
src_step = src_voices[voice].area.step / 8;
dst_step = dst_voices[voice].area.step / 8;
samples1 = samples;
while (samples1-- > 0) {
frames1 = frames;
while (frames1-- > 0) {
signed short sample = alaw2linear(*src);
goto *put;
#define PUT_S16_END after
@ -187,7 +187,7 @@ static void alaw_decode(snd_pcm_plugin_t *plugin,
static void alaw_encode(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
#define GET_S16_LABELS
#include "plugin_ops.h"
@ -201,10 +201,10 @@ static void alaw_encode(snd_pcm_plugin_t *plugin,
char *src;
char *dst;
int src_step, dst_step;
size_t samples1;
size_t frames1;
if (!src_voices[voice].enabled) {
if (dst_voices[voice].wanted)
snd_pcm_area_silence(&dst_voices[voice].area, 0, samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voices[voice].area, 0, frames, plugin->dst_format.format);
dst_voices[voice].enabled = 0;
continue;
}
@ -213,8 +213,8 @@ static void alaw_encode(snd_pcm_plugin_t *plugin,
dst = dst_voices[voice].area.addr + dst_voices[voice].area.first / 8;
src_step = src_voices[voice].area.step / 8;
dst_step = dst_voices[voice].area.step / 8;
samples1 = samples;
while (samples1-- > 0) {
frames1 = frames;
while (frames1-- > 0) {
goto *get;
#define GET_S16_END after
#include "plugin_ops.h"
@ -230,14 +230,14 @@ static void alaw_encode(snd_pcm_plugin_t *plugin,
static ssize_t alaw_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
alaw_t *data;
unsigned int voice;
if (plugin == NULL || src_voices == NULL || dst_voices == NULL)
return -EFAULT;
if (samples == 0)
if (frames == 0)
return 0;
for (voice = 0; voice < plugin->src_format.voices; voice++) {
if (src_voices[voice].area.first % 8 != 0 ||
@ -248,8 +248,8 @@ static ssize_t alaw_transfer(snd_pcm_plugin_t *plugin,
return -EINVAL;
}
data = (alaw_t *)plugin->extra_data;
data->func(plugin, src_voices, dst_voices, samples);
return samples;
data->func(plugin, src_voices, dst_voices, frames);
return frames;
}
int snd_pcm_plugin_build_alaw(snd_pcm_plugin_handle_t *handle,

View file

@ -38,14 +38,14 @@
static ssize_t copy_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
unsigned int voice;
unsigned int nvoices;
if (plugin == NULL || src_voices == NULL || dst_voices == NULL)
return -EFAULT;
if (samples == 0)
if (frames == 0)
return 0;
nvoices = plugin->src_format.voices;
for (voice = 0; voice < nvoices; voice++) {
@ -57,16 +57,16 @@ static ssize_t copy_transfer(snd_pcm_plugin_t *plugin,
return -EINVAL;
if (!src_voices->enabled) {
if (dst_voices->wanted)
snd_pcm_area_silence(&dst_voices->area, 0, samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voices->area, 0, frames, plugin->dst_format.format);
dst_voices->enabled = 0;
continue;
}
dst_voices->enabled = 1;
snd_pcm_area_copy(&src_voices->area, 0, &dst_voices->area, 0, samples, plugin->src_format.format);
snd_pcm_area_copy(&src_voices->area, 0, &dst_voices->area, 0, frames, plugin->src_format.format);
src_voices++;
dst_voices++;
}
return samples;
return frames;
}
int snd_pcm_plugin_build_copy(snd_pcm_plugin_handle_t *handle,

View file

@ -48,7 +48,7 @@ typedef struct io_private_data {
static ssize_t io_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
io_t *data;
ssize_t result;
@ -64,7 +64,7 @@ static ssize_t io_transfer(snd_pcm_plugin_t *plugin,
if (plugin->channel == SND_PCM_CHANNEL_PLAYBACK) {
if (src_voices == NULL)
return -EINVAL;
if ((result = snd_pcm_plugin_src_samples_to_size(plugin, samples)) < 0)
if ((result = snd_pcm_plugin_src_frames_to_size(plugin, frames)) < 0)
return result;
count = plugin->src_format.voices;
if (plugin->src_format.interleave) {
@ -82,11 +82,11 @@ static ssize_t io_transfer(snd_pcm_plugin_t *plugin,
}
if (result < 0)
return result;
return snd_pcm_plugin_src_size_to_samples(plugin, result);
return snd_pcm_plugin_src_size_to_frames(plugin, result);
} else if (plugin->channel == SND_PCM_CHANNEL_CAPTURE) {
if (dst_voices == NULL)
return -EINVAL;
if ((result = snd_pcm_plugin_dst_samples_to_size(plugin, samples)) < 0)
if ((result = snd_pcm_plugin_dst_frames_to_size(plugin, frames)) < 0)
return result;
count = plugin->dst_format.voices;
if (plugin->dst_format.interleave) {
@ -108,26 +108,26 @@ static ssize_t io_transfer(snd_pcm_plugin_t *plugin,
}
if (result < 0)
return result;
return snd_pcm_plugin_dst_size_to_samples(plugin, result);
return snd_pcm_plugin_dst_size_to_frames(plugin, result);
} else {
return -EINVAL;
}
}
static ssize_t io_src_voices(snd_pcm_plugin_t *plugin,
size_t samples,
size_t frames,
snd_pcm_plugin_voice_t **voices)
{
int err;
unsigned int voice;
snd_pcm_plugin_voice_t *v;
err = snd_pcm_plugin_client_voices(plugin, samples, &v);
err = snd_pcm_plugin_client_voices(plugin, frames, &v);
if (err < 0)
return err;
*voices = v;
for (voice = 0; voice < plugin->src_format.voices; ++voice, ++v)
v->wanted = 1;
return samples;
return frames;
}
int snd_pcm_plugin_build_io(snd_pcm_plugin_handle_t *pcm,

View file

@ -47,7 +47,7 @@ typedef struct linear_private_data {
static void convert(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
#define CONV_LABELS
#include "plugin_ops.h"
@ -60,10 +60,10 @@ static void convert(snd_pcm_plugin_t *plugin,
char *src;
char *dst;
int src_step, dst_step;
size_t samples1;
size_t frames1;
if (!src_voices[voice].enabled) {
if (dst_voices[voice].wanted)
snd_pcm_area_silence(&dst_voices[voice].area, 0, samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voices[voice].area, 0, frames, plugin->dst_format.format);
dst_voices[voice].enabled = 0;
continue;
}
@ -72,8 +72,8 @@ static void convert(snd_pcm_plugin_t *plugin,
dst = dst_voices[voice].area.addr + dst_voices[voice].area.first / 8;
src_step = src_voices[voice].area.step / 8;
dst_step = dst_voices[voice].area.step / 8;
samples1 = samples;
while (samples1-- > 0) {
frames1 = frames;
while (frames1-- > 0) {
goto *conv;
#define CONV_END after
#include "plugin_ops.h"
@ -88,7 +88,7 @@ static void convert(snd_pcm_plugin_t *plugin,
static ssize_t linear_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
linear_t *data;
unsigned int voice;
@ -96,7 +96,7 @@ static ssize_t linear_transfer(snd_pcm_plugin_t *plugin,
if (plugin == NULL || src_voices == NULL || dst_voices == NULL)
return -EFAULT;
data = (linear_t *)plugin->extra_data;
if (samples == 0)
if (frames == 0)
return 0;
for (voice = 0; voice < plugin->src_format.voices; voice++) {
if (src_voices[voice].area.first % 8 != 0 ||
@ -106,8 +106,8 @@ static ssize_t linear_transfer(snd_pcm_plugin_t *plugin,
dst_voices[voice].area.step % 8 != 0)
return -EINVAL;
}
convert(plugin, src_voices, dst_voices, samples);
return samples;
convert(plugin, src_voices, dst_voices, frames);
return frames;
}
int conv_index(int src_format, int dst_format)

View file

@ -44,7 +44,7 @@ typedef struct mmap_private_data {
static ssize_t mmap_src_voices(snd_pcm_plugin_t *plugin,
size_t samples,
size_t frames,
snd_pcm_plugin_voice_t **voices)
{
mmap_t *data;
@ -86,9 +86,9 @@ static ssize_t mmap_src_voices(snd_pcm_plugin_t *plugin,
assert(snd_pcm_mmap_ready(data->slave, plugin->channel));
}
pos = ctrl->byte_data % setup->buffer_size;
if ((pos * 8) % chan->bits_per_sample != 0)
if ((pos * 8) % chan->bits_per_frame != 0)
return -EINVAL;
pos = (pos * 8) / chan->bits_per_sample;
pos = (pos * 8) / chan->bits_per_frame;
sv = plugin->src_voices;
dv = chan->voices;
@ -107,11 +107,11 @@ static ssize_t mmap_src_voices(snd_pcm_plugin_t *plugin,
++sv;
++dv;
}
return snd_pcm_mmap_samples_xfer(data->slave, plugin->channel, samples);
return snd_pcm_mmap_frames_xfer(data->slave, plugin->channel, frames);
}
static ssize_t mmap_dst_voices(snd_pcm_plugin_t *plugin,
size_t samples,
size_t frames,
snd_pcm_plugin_voice_t **voices)
{
mmap_t *data;
@ -159,9 +159,9 @@ static ssize_t mmap_dst_voices(snd_pcm_plugin_t *plugin,
assert(snd_pcm_mmap_ready(data->slave, plugin->channel));
}
pos = ctrl->byte_data % setup->buffer_size;
if ((pos * 8) % chan->bits_per_sample != 0)
if ((pos * 8) % chan->bits_per_frame != 0)
return -EINVAL;
pos = (pos * 8) / chan->bits_per_sample;
pos = (pos * 8) / chan->bits_per_frame;
sv = chan->voices;
dv = plugin->dst_voices;
@ -176,13 +176,13 @@ static ssize_t mmap_dst_voices(snd_pcm_plugin_t *plugin,
++sv;
++dv;
}
return snd_pcm_mmap_samples_xfer(data->slave, plugin->channel, samples);
return snd_pcm_mmap_frames_xfer(data->slave, plugin->channel, frames);
}
static ssize_t mmap_playback_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices UNUSED,
size_t samples)
size_t frames)
{
mmap_t *data;
snd_pcm_channel_setup_t *setup;
@ -210,7 +210,7 @@ static ssize_t mmap_playback_transfer(snd_pcm_plugin_t *plugin,
}
#endif
snd_pcm_mmap_commit_samples(data->slave, SND_PCM_CHANNEL_PLAYBACK, samples);
snd_pcm_mmap_commit_frames(data->slave, SND_PCM_CHANNEL_PLAYBACK, frames);
if (ctrl->status == SND_PCM_STATUS_PREPARED &&
(chan->setup.start_mode == SND_PCM_START_DATA ||
(chan->setup.start_mode == SND_PCM_START_FULL &&
@ -219,13 +219,13 @@ static ssize_t mmap_playback_transfer(snd_pcm_plugin_t *plugin,
if (err < 0)
return err;
}
return samples;
return frames;
}
static ssize_t mmap_capture_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices UNUSED,
snd_pcm_plugin_voice_t *dst_voices UNUSED,
size_t samples)
size_t frames)
{
mmap_t *data;
snd_pcm_channel_setup_t *setup;
@ -243,8 +243,8 @@ static ssize_t mmap_capture_transfer(snd_pcm_plugin_t *plugin,
setup = &data->slave->chan[SND_PCM_CHANNEL_CAPTURE].setup;
/* FIXME: not here the increment */
snd_pcm_mmap_commit_samples(data->slave, SND_PCM_CHANNEL_CAPTURE, samples);
return samples;
snd_pcm_mmap_commit_frames(data->slave, SND_PCM_CHANNEL_CAPTURE, frames);
return frames;
}
static int mmap_action(snd_pcm_plugin_t *plugin,

View file

@ -151,7 +151,7 @@ static int ulaw2linear(unsigned char u_val)
typedef void (*mulaw_f)(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples);
size_t frames);
typedef struct mulaw_private_data {
mulaw_f func;
@ -161,7 +161,7 @@ typedef struct mulaw_private_data {
static void mulaw_decode(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
#define PUT_S16_LABELS
#include "plugin_ops.h"
@ -174,10 +174,10 @@ static void mulaw_decode(snd_pcm_plugin_t *plugin,
char *src;
char *dst;
int src_step, dst_step;
size_t samples1;
size_t frames1;
if (!src_voices[voice].enabled) {
if (dst_voices[voice].wanted)
snd_pcm_area_silence(&dst_voices[voice].area, 0, samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voices[voice].area, 0, frames, plugin->dst_format.format);
dst_voices[voice].enabled = 0;
continue;
}
@ -186,8 +186,8 @@ static void mulaw_decode(snd_pcm_plugin_t *plugin,
dst = dst_voices[voice].area.addr + dst_voices[voice].area.first / 8;
src_step = src_voices[voice].area.step / 8;
dst_step = dst_voices[voice].area.step / 8;
samples1 = samples;
while (samples1-- > 0) {
frames1 = frames;
while (frames1-- > 0) {
signed short sample = ulaw2linear(*src);
goto *put;
#define PUT_S16_END after
@ -203,7 +203,7 @@ static void mulaw_decode(snd_pcm_plugin_t *plugin,
static void mulaw_encode(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
#define GET_S16_LABELS
#include "plugin_ops.h"
@ -217,10 +217,10 @@ static void mulaw_encode(snd_pcm_plugin_t *plugin,
char *src;
char *dst;
int src_step, dst_step;
size_t samples1;
size_t frames1;
if (!src_voices[voice].enabled) {
if (dst_voices[voice].wanted)
snd_pcm_area_silence(&dst_voices[voice].area, 0, samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voices[voice].area, 0, frames, plugin->dst_format.format);
dst_voices[voice].enabled = 0;
continue;
}
@ -229,8 +229,8 @@ static void mulaw_encode(snd_pcm_plugin_t *plugin,
dst = dst_voices[voice].area.addr + dst_voices[voice].area.first / 8;
src_step = src_voices[voice].area.step / 8;
dst_step = dst_voices[voice].area.step / 8;
samples1 = samples;
while (samples1-- > 0) {
frames1 = frames;
while (frames1-- > 0) {
goto *get;
#define GET_S16_END after
#include "plugin_ops.h"
@ -246,14 +246,14 @@ static void mulaw_encode(snd_pcm_plugin_t *plugin,
static ssize_t mulaw_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
mulaw_t *data;
unsigned int voice;
if (plugin == NULL || src_voices == NULL || dst_voices == NULL)
return -EFAULT;
if (samples == 0)
if (frames == 0)
return 0;
for (voice = 0; voice < plugin->src_format.voices; voice++) {
if (src_voices[voice].area.first % 8 != 0 ||
@ -264,8 +264,8 @@ static ssize_t mulaw_transfer(snd_pcm_plugin_t *plugin,
return -EINVAL;
}
data = (mulaw_t *)plugin->extra_data;
data->func(plugin, src_voices, dst_voices, samples);
return samples;
data->func(plugin, src_voices, dst_voices, frames);
return frames;
}
int snd_pcm_plugin_build_mulaw(snd_pcm_plugin_handle_t *handle,

View file

@ -50,14 +50,14 @@ typedef struct {
typedef void (*rate_f)(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
int src_samples, int dst_samples);
int src_frames, int dst_frames);
typedef struct rate_private_data {
unsigned int pitch;
unsigned int pos;
rate_f func;
int get, put;
ssize_t old_src_samples, old_dst_samples;
ssize_t old_src_frames, old_dst_frames;
rate_voice_t voices[0];
} rate_t;
@ -75,7 +75,7 @@ static void rate_init(snd_pcm_plugin_t *plugin)
static void resample_expand(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
int src_samples, int dst_samples)
int src_frames, int dst_frames)
{
unsigned int pos = 0;
signed int val;
@ -83,7 +83,7 @@ static void resample_expand(snd_pcm_plugin_t *plugin,
char *src, *dst;
unsigned int voice;
int src_step, dst_step;
int src_samples1, dst_samples1;
int src_frames1, dst_frames1;
rate_t *data = (rate_t *)plugin->extra_data;
rate_voice_t *rvoices = data->voices;
@ -106,7 +106,7 @@ static void resample_expand(snd_pcm_plugin_t *plugin,
S2 = rvoices->last_S2;
if (!src_voices[voice].enabled) {
if (dst_voices[voice].wanted)
snd_pcm_area_silence(&dst_voices[voice].area, 0, dst_samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voices[voice].area, 0, dst_frames, plugin->dst_format.format);
dst_voices[voice].enabled = 0;
continue;
}
@ -115,8 +115,8 @@ static void resample_expand(snd_pcm_plugin_t *plugin,
dst = (char *)dst_voices[voice].area.addr + dst_voices[voice].area.first / 8;
src_step = src_voices[voice].area.step / 8;
dst_step = dst_voices[voice].area.step / 8;
src_samples1 = src_samples;
dst_samples1 = dst_samples;
src_frames1 = src_frames;
dst_frames1 = dst_frames;
if (pos & ~MASK) {
get_s16_end = &&after_get1;
goto *get;
@ -125,13 +125,13 @@ static void resample_expand(snd_pcm_plugin_t *plugin,
S1 = S2;
S2 = sample;
src += src_step;
src_samples--;
src_frames--;
}
while (dst_samples1-- > 0) {
while (dst_frames1-- > 0) {
if (pos & ~MASK) {
pos &= MASK;
S1 = S2;
if (src_samples1-- > 0) {
if (src_frames1-- > 0) {
get_s16_end = &&after_get2;
goto *get;
after_get2:
@ -163,7 +163,7 @@ static void resample_expand(snd_pcm_plugin_t *plugin,
static void resample_shrink(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
int src_samples, int dst_samples)
int src_frames, int dst_frames)
{
unsigned int pos = 0;
signed int val;
@ -171,7 +171,7 @@ static void resample_shrink(snd_pcm_plugin_t *plugin,
char *src, *dst;
unsigned int voice;
int src_step, dst_step;
int src_samples1, dst_samples1;
int src_frames1, dst_frames1;
rate_t *data = (rate_t *)plugin->extra_data;
rate_voice_t *rvoices = data->voices;
@ -190,7 +190,7 @@ static void resample_shrink(snd_pcm_plugin_t *plugin,
S2 = rvoices->last_S2;
if (!src_voices[voice].enabled) {
if (dst_voices[voice].wanted)
snd_pcm_area_silence(&dst_voices[voice].area, 0, dst_samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voices[voice].area, 0, dst_frames, plugin->dst_format.format);
dst_voices[voice].enabled = 0;
continue;
}
@ -199,11 +199,11 @@ static void resample_shrink(snd_pcm_plugin_t *plugin,
dst = (char *)dst_voices[voice].area.addr + dst_voices[voice].area.first / 8;
src_step = src_voices[voice].area.step / 8;
dst_step = dst_voices[voice].area.step / 8;
src_samples1 = src_samples;
dst_samples1 = dst_samples;
while (dst_samples1 > 0) {
src_frames1 = src_frames;
dst_frames1 = dst_frames;
while (dst_frames1 > 0) {
S1 = S2;
if (src_samples1-- > 0) {
if (src_frames1-- > 0) {
goto *get;
#define GET_S16_END after_get
#include "plugin_ops.h"
@ -226,7 +226,7 @@ static void resample_shrink(snd_pcm_plugin_t *plugin,
#undef PUT_S16_END
after_put:
dst += dst_step;
dst_samples1--;
dst_frames1--;
}
pos += data->pitch;
}
@ -237,80 +237,80 @@ static void resample_shrink(snd_pcm_plugin_t *plugin,
data->pos = pos;
}
static ssize_t rate_src_samples(snd_pcm_plugin_t *plugin, size_t samples)
static ssize_t rate_src_frames(snd_pcm_plugin_t *plugin, size_t frames)
{
rate_t *data;
ssize_t res;
if (plugin == NULL || samples <= 0)
if (plugin == NULL || frames <= 0)
return -EINVAL;
data = (rate_t *)plugin->extra_data;
if (plugin->src_format.rate < plugin->dst_format.rate) {
res = (((samples * data->pitch) + (BITS/2)) >> SHIFT);
res = (((frames * data->pitch) + (BITS/2)) >> SHIFT);
} else {
res = (((samples << SHIFT) + (data->pitch / 2)) / data->pitch);
res = (((frames << SHIFT) + (data->pitch / 2)) / data->pitch);
}
if (data->old_src_samples > 0) {
ssize_t samples1 = samples, res1 = data->old_dst_samples;
while (data->old_src_samples < samples1) {
samples1 >>= 1;
if (data->old_src_frames > 0) {
ssize_t frames1 = frames, res1 = data->old_dst_frames;
while (data->old_src_frames < frames1) {
frames1 >>= 1;
res1 <<= 1;
}
while (data->old_src_samples > samples1) {
samples1 <<= 1;
while (data->old_src_frames > frames1) {
frames1 <<= 1;
res1 >>= 1;
}
if (data->old_src_samples == samples1)
if (data->old_src_frames == frames1)
return res1;
}
data->old_src_samples = samples;
data->old_dst_samples = res;
data->old_src_frames = frames;
data->old_dst_frames = res;
return res;
}
static ssize_t rate_dst_samples(snd_pcm_plugin_t *plugin, size_t samples)
static ssize_t rate_dst_frames(snd_pcm_plugin_t *plugin, size_t frames)
{
rate_t *data;
ssize_t res;
if (plugin == NULL || samples <= 0)
if (plugin == NULL || frames <= 0)
return -EINVAL;
data = (rate_t *)plugin->extra_data;
if (plugin->src_format.rate < plugin->dst_format.rate) {
res = (((samples << SHIFT) + (data->pitch / 2)) / data->pitch);
res = (((frames << SHIFT) + (data->pitch / 2)) / data->pitch);
} else {
res = (((samples * data->pitch) + (BITS/2)) >> SHIFT);
res = (((frames * data->pitch) + (BITS/2)) >> SHIFT);
}
if (data->old_dst_samples > 0) {
ssize_t samples1 = samples, res1 = data->old_src_samples;
while (data->old_dst_samples < samples1) {
samples1 >>= 1;
if (data->old_dst_frames > 0) {
ssize_t frames1 = frames, res1 = data->old_src_frames;
while (data->old_dst_frames < frames1) {
frames1 >>= 1;
res1 <<= 1;
}
while (data->old_dst_samples > samples1) {
samples1 <<= 1;
while (data->old_dst_frames > frames1) {
frames1 <<= 1;
res1 >>= 1;
}
if (data->old_dst_samples == samples1)
if (data->old_dst_frames == frames1)
return res1;
}
data->old_dst_samples = samples;
data->old_src_samples = res;
data->old_dst_frames = frames;
data->old_src_frames = res;
return res;
}
static ssize_t rate_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
size_t dst_samples;
size_t dst_frames;
unsigned int voice;
rate_t *data;
if (plugin == NULL || src_voices == NULL || dst_voices == NULL)
return -EFAULT;
if (samples == 0)
if (frames == 0)
return 0;
for (voice = 0; voice < plugin->src_format.voices; voice++) {
if (src_voices[voice].area.first % 8 != 0 ||
@ -321,10 +321,10 @@ static ssize_t rate_transfer(snd_pcm_plugin_t *plugin,
return -EINVAL;
}
dst_samples = rate_dst_samples(plugin, samples);
dst_frames = rate_dst_frames(plugin, frames);
data = (rate_t *)plugin->extra_data;
data->func(plugin, src_voices, dst_voices, samples, dst_samples);
return dst_samples;
data->func(plugin, src_voices, dst_voices, frames, dst_frames);
return dst_frames;
}
static int rate_action(snd_pcm_plugin_t *plugin,
@ -392,10 +392,10 @@ int snd_pcm_plugin_build_rate(snd_pcm_plugin_handle_t *handle,
}
data->pos = 0;
rate_init(plugin);
data->old_src_samples = data->old_dst_samples = 0;
data->old_src_frames = data->old_dst_frames = 0;
plugin->transfer = rate_transfer;
plugin->src_samples = rate_src_samples;
plugin->dst_samples = rate_dst_samples;
plugin->src_frames = rate_src_frames;
plugin->dst_frames = rate_dst_frames;
plugin->action = rate_action;
*r_plugin = plugin;
return 0;

View file

@ -35,13 +35,22 @@
#include "../pcm_local.h"
#endif
/* The best possible hack to support missing optimization in gcc 2.7.2.3 */
#if ROUTE_PLUGIN_RESOLUTION & (ROUTE_PLUGIN_RESOLUTION - 1) != 0
#define div(a) a /= ROUTE_PLUGIN_RESOLUTION
#elif ROUTE_PLUGIN_RESOLUTION == 16
#define div(a) a >>= 4
#else
#error "Add some code here"
#endif
typedef struct ttable_dst ttable_dst_t;
typedef struct route_private_data route_t;
typedef void (*route_voice_f)(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voice,
ttable_dst_t* ttable, size_t samples);
ttable_dst_t* ttable, size_t frames);
typedef struct {
int voice;
@ -78,17 +87,17 @@ typedef union {
static void route_to_voice_from_zero(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices UNUSED,
snd_pcm_plugin_voice_t *dst_voice,
ttable_dst_t* ttable UNUSED, size_t samples)
ttable_dst_t* ttable UNUSED, size_t frames)
{
if (dst_voice->wanted)
snd_pcm_area_silence(&dst_voice->area, 0, samples, plugin->dst_format.format);
snd_pcm_area_silence(&dst_voice->area, 0, frames, plugin->dst_format.format);
dst_voice->enabled = 0;
}
static void route_to_voice_from_one(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voice,
ttable_dst_t* ttable, size_t samples)
ttable_dst_t* ttable, size_t frames)
{
#define CONV_LABELS
#include "plugin_ops.h"
@ -105,7 +114,7 @@ static void route_to_voice_from_one(snd_pcm_plugin_t *plugin,
break;
}
if (srcidx == ttable->nsrcs) {
route_to_voice_from_zero(plugin, src_voices, dst_voice, ttable, samples);
route_to_voice_from_zero(plugin, src_voices, dst_voice, ttable, frames);
return;
}
@ -115,7 +124,7 @@ static void route_to_voice_from_one(snd_pcm_plugin_t *plugin,
src_step = src_voice->area.step / 8;
dst = dst_voice->area.addr + dst_voice->area.first / 8;
dst_step = dst_voice->area.step / 8;
while (samples-- > 0) {
while (frames-- > 0) {
goto *conv;
#define CONV_END after
#include "plugin_ops.h"
@ -129,7 +138,7 @@ static void route_to_voice_from_one(snd_pcm_plugin_t *plugin,
static void route_to_voice(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voice,
ttable_dst_t* ttable, size_t samples)
ttable_dst_t* ttable, size_t frames)
{
#define GET_U_LABELS
#define PUT_U32_LABELS
@ -197,10 +206,10 @@ static void route_to_voice(snd_pcm_plugin_t *plugin,
}
nsrcs = srcidx1;
if (nsrcs == 0) {
route_to_voice_from_zero(plugin, src_voices, dst_voice, ttable, samples);
route_to_voice_from_zero(plugin, src_voices, dst_voice, ttable, frames);
return;
} else if (nsrcs == 1 && src_tt[0].as_int == ROUTE_PLUGIN_RESOLUTION) {
route_to_voice_from_one(plugin, src_voices, dst_voice, ttable, samples);
route_to_voice_from_one(plugin, src_voices, dst_voice, ttable, frames);
return;
}
@ -213,7 +222,7 @@ static void route_to_voice(snd_pcm_plugin_t *plugin,
dst = dst_voice->area.addr + dst_voice->area.first / 8;
dst_step = dst_voice->area.step / 8;
while (samples-- > 0) {
while (frames-- > 0) {
ttable_src_t *ttp = src_tt;
sum_t sum;
@ -277,21 +286,21 @@ static void route_to_voice(snd_pcm_plugin_t *plugin,
norm_int64_8_att:
sum.as_uint64 <<= 8;
norm_int64_0_att:
sum.as_uint64 /= ROUTE_PLUGIN_RESOLUTION;
div(sum.as_uint64);
goto norm_int;
norm_int32_16_att:
sum.as_uint64 = sum.as_uint32;
norm_int64_16_att:
sum.as_uint64 <<= 16;
sum.as_uint64 /= ROUTE_PLUGIN_RESOLUTION;
div(sum.as_uint64);
goto norm_int;
norm_int32_24_att:
sum.as_uint64 = sum.as_uint32;
norm_int64_24_att:
sum.as_uint64 <<= 24;
sum.as_uint64 /= ROUTE_PLUGIN_RESOLUTION;
div(sum.as_uint64);
goto norm_int;
norm_int32_8_noatt:
@ -478,7 +487,7 @@ static int route_load_ttable(snd_pcm_plugin_t *plugin,
static ssize_t route_transfer(snd_pcm_plugin_t *plugin,
const snd_pcm_plugin_voice_t *src_voices,
snd_pcm_plugin_voice_t *dst_voices,
size_t samples)
size_t frames)
{
route_t *data;
int src_nvoices, dst_nvoices;
@ -488,7 +497,7 @@ static ssize_t route_transfer(snd_pcm_plugin_t *plugin,
if (plugin == NULL || src_voices == NULL || dst_voices == NULL)
return -EFAULT;
if (samples == 0)
if (frames == 0)
return 0;
data = (route_t *)plugin->extra_data;
@ -509,11 +518,11 @@ static ssize_t route_transfer(snd_pcm_plugin_t *plugin,
ttp = data->ttable;
dvp = dst_voices;
for (dst_voice = 0; dst_voice < dst_nvoices; ++dst_voice) {
ttp->func(plugin, src_voices, dvp, ttp, samples);
ttp->func(plugin, src_voices, dvp, ttp, frames);
dvp++;
ttp++;
}
return samples;
return frames;
}
int getput_index(int format)