@@ -68,7 +68,7 @@ Audio_File::read_peaks( float fpp, nframes_t start, nframes_t end, int *peaks, P | |||
*pbuf = new Peak[ *peaks * *channels ]; | |||
/* deinterlace */ | |||
/* deintereave peaks */ | |||
int k = 0; | |||
for ( int i = 0; i < *channels; i++ ) | |||
for ( int j = i; j < *peaks * *channels; j += *channels ) | |||
@@ -19,6 +19,8 @@ | |||
#include "Audio_Track.H" | |||
#include "dsp.h" | |||
#include <Fl/fl_ask.H> | |||
static | |||
@@ -142,18 +144,9 @@ Audio_Track::play ( sample_t *buf, nframes_t frame, nframes_t nframes, int chann | |||
continue; | |||
if ( channels == 1 ) | |||
{ | |||
// memcpy( buf, cbuf, nframes * sizeof( sample_t ) ); | |||
for ( unsigned int j = 0; j < nfr; ++j ) | |||
buf[ j ] += cbuf[ j ]; | |||
} | |||
buffer_mix( buf, cbuf, nframes ); | |||
else | |||
{ | |||
/* mix and interleave */ | |||
int k = 0; | |||
for ( unsigned int j = i; k < nfr; j += channels ) | |||
buf[ j ] += cbuf[ k++ ]; | |||
} | |||
buffer_interleave_one_channel_and_mix( buf, cbuf, i, channels, nframes ); | |||
} | |||
} | |||
@@ -13,6 +13,7 @@ SRCS= \ | |||
Audio_File_SF.C \ | |||
Port.C \ | |||
Disk_Stream.C \ | |||
dsp.c \ | |||
Engine.C \ | |||
Transport.C \ | |||
Loggable.C \ | |||
@@ -22,6 +22,8 @@ | |||
#include "Timeline.H" | |||
#include "Waveform.H" | |||
#include "dsp.h" | |||
#include <FL/fl_draw.H> | |||
#include <FL/Fl.H> | |||
#include <FL/Fl_Group.H> | |||
@@ -850,9 +852,7 @@ Region::read ( sample_t *buf, nframes_t pos, nframes_t nframes, int channel ) co | |||
/* apply gain */ | |||
if ( _scale != 1.0f ) | |||
for ( int i = cnt; i--; ) | |||
buf[i] *= _scale; | |||
buffer_apply_gain( buf, cnt, _scale ); | |||
/* perform declicking if necessary */ | |||
@@ -0,0 +1,94 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
/* General DSP related functions. */ | |||
#include "dsp.h" | |||
/* TODO: these functions are all targets for optimization (SSE?) */ | |||
void | |||
buffer_apply_gain ( sample_t *buf, nframes_t nframes, float g ) | |||
{ | |||
if ( g != 1.0f ) | |||
while ( nframes-- ) | |||
*(buf++) *= g; | |||
} | |||
void | |||
buffer_apply_gain_buffer ( sample_t *buf, sample_t *gainbuf, nframes_t nframes ) | |||
{ | |||
while ( nframes-- ) | |||
*(buf++) *= *(gainbuf++); | |||
} | |||
void | |||
buffer_mix ( sample_t *dst, sample_t *src, nframes_t nframes ) | |||
{ | |||
while ( nframes-- ) | |||
*(dst++) += *(src++); | |||
} | |||
void | |||
buffer_mix_with_gain ( sample_t *dst, sample_t *src, nframes_t nframes, float g ) | |||
{ | |||
while ( nframes-- ) | |||
*(dst++) += *(src++) * g; | |||
} | |||
void | |||
buffer_interleave_one_channel ( sample_t *dst, sample_t *src, int channel, int channels, nframes_t nframes ) | |||
{ | |||
nframes *= channels; | |||
dst += channel; | |||
while ( nframes-- ) | |||
{ | |||
*dst = *(src++); | |||
dst += channels; | |||
} | |||
} | |||
void | |||
buffer_interleave_one_channel_and_mix ( sample_t *dst, sample_t *src, int channel, int channels, nframes_t nframes ) | |||
{ | |||
nframes *= channels; | |||
dst += channel; | |||
while ( nframes-- ) | |||
{ | |||
*dst += *(src++); | |||
dst += channels; | |||
} | |||
} | |||
void | |||
buffer_deinterleave_one_channel ( sample_t *dst, sample_t *src, int channel, int channels, nframes_t nframes ) | |||
{ | |||
nframes *= channels; | |||
src += channel; | |||
while ( nframes-- ) | |||
{ | |||
*(dst++) = *src; | |||
src += channels; | |||
} | |||
} |
@@ -0,0 +1,30 @@ | |||
/*******************************************************************************/ | |||
/* Copyright (C) 2008 Jonathan Moore Liles */ | |||
/* */ | |||
/* This program is free software; you can redistribute it and/or modify it */ | |||
/* under the terms of the GNU General Public License as published by the */ | |||
/* Free Software Foundation; either version 2 of the License, or (at your */ | |||
/* option) any later version. */ | |||
/* */ | |||
/* This program is distributed in the hope that it will be useful, but WITHOUT */ | |||
/* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or */ | |||
/* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for */ | |||
/* more details. */ | |||
/* */ | |||
/* You should have received a copy of the GNU General Public License along */ | |||
/* with This program; see the file COPYING. If not,write to the Free Software */ | |||
/* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ | |||
/*******************************************************************************/ | |||
#pragma once | |||
#include "types.h" | |||
void buffer_apply_gain ( sample_t *buf, nframes_t nframes, float g ); | |||
void buffer_apply_gain_buffer ( sample_t *buf, sample_t *gainbuf, nframes_t nframes ); | |||
void buffer_mix ( sample_t *dst, sample_t *src, nframes_t nframes ); | |||
void buffer_mix_with_gain ( sample_t *dst, sample_t *src, nframes_t nframes, float g ); | |||
void buffer_interleave_one_channel ( sample_t *dst, sample_t *src, int channel, int channels, nframes_t nframes ); | |||
void buffer_interleave_one_channel_and_mix ( sample_t *dst, sample_t *src, int channel, int channels, nframes_t nframes ); | |||
void buffer_deinterleave_one_channel ( sample_t *dst, sample_t *src, int channel, int channels, nframes_t nframes ); |