Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Simplify sample frame operations (make it a class) #7156

Open
wants to merge 26 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
a42e764
Remove the struct StereoSample
michaelgregorius Mar 22, 2024
ffb89b6
Simplify AudioEngine::getPeakValues
michaelgregorius Mar 22, 2024
ad5d88b
Remove surroundSampleFrame
michaelgregorius Mar 22, 2024
1c86e7e
Make sampleFrame a class
michaelgregorius Mar 22, 2024
974fbac
More operators and methods for sampleFrame
michaelgregorius Mar 23, 2024
de79243
Adjust DelayEffect to methods in sampleFrame
michaelgregorius Mar 23, 2024
bd40852
Use composition instead of inheritance
michaelgregorius Mar 27, 2024
925a58c
Apply suggestions from code review
michaelgregorius Mar 27, 2024
2e3a33c
Merge remote-tracking branch 'upstream/master' into SampleFrameAsClas…
michaelgregorius Mar 27, 2024
a433fd3
Merge remote-tracking branch 'upstream/master' into SampleFrameAsClas…
michaelgregorius Mar 29, 2024
896d70c
Fix warnings: zeroing non-trivial type
michaelgregorius Apr 1, 2024
e9969e7
Merge remote-tracking branch 'upstream/master' into SFACMerge
michaelgregorius Apr 2, 2024
d573913
Remove unnecessary reinterpret_casts
michaelgregorius Apr 2, 2024
4b69aae
Clean up zeroSampleFrames code
michaelgregorius Apr 2, 2024
d28edb2
Merge remote-tracking branch 'upstream/master' into SampleFrameAsClas…
michaelgregorius May 9, 2024
ba30c42
Fix warnings in RemotePlugin
michaelgregorius May 9, 2024
ad65951
Rename "sampleFrame" to "SampleFrame"
michaelgregorius Mar 27, 2024
017465d
Move SampleFrame into its own file
michaelgregorius Mar 27, 2024
3ab1524
Return reference for += and *=
michaelgregorius May 18, 2024
4878d1c
Explicit float constructor
michaelgregorius May 18, 2024
1fe8971
Use std::fill in zeroSampleFrames
michaelgregorius May 18, 2024
2df412d
Use zeroSampleFrames in sanitize
michaelgregorius May 18, 2024
4b5ede5
Replace max with absMax
michaelgregorius May 18, 2024
b4782de
Replace scalarProduct
michaelgregorius May 18, 2024
ae919ec
Remove comment/TODO
michaelgregorius May 18, 2024
0fee3b6
Simplify sanitize
michaelgregorius May 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
9 changes: 5 additions & 4 deletions include/AudioDevice.h
Expand Up @@ -37,6 +37,7 @@ namespace lmms

class AudioEngine;
class AudioPort;
class SampleFrame;


class AudioDevice
Expand Down Expand Up @@ -92,14 +93,14 @@ class AudioDevice
protected:
// subclasses can re-implement this for being used in conjunction with
// processNextBuffer()
virtual void writeBuffer(const surroundSampleFrame* /* _buf*/, const fpp_t /*_frames*/) {}
virtual void writeBuffer(const SampleFrame* /* _buf*/, const fpp_t /*_frames*/) {}

// called by according driver for fetching new sound-data
fpp_t getNextBuffer( surroundSampleFrame * _ab );
fpp_t getNextBuffer(SampleFrame* _ab);

// convert a given audio-buffer to a buffer in signed 16-bit samples
// returns num of bytes in outbuf
int convertToS16( const surroundSampleFrame * _ab,
int convertToS16(const SampleFrame* _ab,
const fpp_t _frames,
int_sample_t * _output_buffer,
const bool _convert_endian = false );
Expand Down Expand Up @@ -133,7 +134,7 @@ class AudioDevice

QMutex m_devMutex;

surroundSampleFrame * m_buffer;
SampleFrame* m_buffer;

};

Expand Down
2 changes: 1 addition & 1 deletion include/AudioDummy.h
Expand Up @@ -94,7 +94,7 @@ class AudioDummy : public QThread, public AudioDevice
while( true )
{
timer.reset();
const surroundSampleFrame* b = audioEngine()->nextBuffer();
const SampleFrame* b = audioEngine()->nextBuffer();
if( !b )
{
break;
Expand Down
33 changes: 12 additions & 21 deletions include/AudioEngine.h
Expand Up @@ -37,6 +37,7 @@
#include <vector>

#include "lmms_basics.h"
#include "SampleFrame.h"
#include "LocklessList.h"
#include "FifoBuffer.h"
#include "AudioEngineProfiler.h"
Expand All @@ -57,8 +58,7 @@ const fpp_t DEFAULT_BUFFER_SIZE = 256;

const int BYTES_PER_SAMPLE = sizeof( sample_t );
const int BYTES_PER_INT_SAMPLE = sizeof( int_sample_t );
const int BYTES_PER_FRAME = sizeof( sampleFrame );
const int BYTES_PER_SURROUND_FRAME = sizeof( surroundSampleFrame );
const int BYTES_PER_FRAME = sizeof( SampleFrame );

const float OUTPUT_SAMPLE_MULTIPLIER = 32767.0f;

Expand Down Expand Up @@ -266,25 +266,16 @@ class LMMS_EXPORT AudioEngine : public QObject
}


struct StereoSample
{
StereoSample(sample_t _left, sample_t _right) : left(_left), right(_right) {}
sample_t left;
sample_t right;
};
StereoSample getPeakValues(sampleFrame * ab, const f_cnt_t _frames) const;


bool criticalXRuns() const;

inline bool hasFifoWriter() const
{
return m_fifoWriter != nullptr;
}

void pushInputFrames( sampleFrame * _ab, const f_cnt_t _frames );
void pushInputFrames( SampleFrame * _ab, const f_cnt_t _frames );

inline const sampleFrame * inputBuffer()
inline const SampleFrame * inputBuffer()
{
return m_inputBuffer[ m_inputBufferRead ];
}
Expand All @@ -294,7 +285,7 @@ class LMMS_EXPORT AudioEngine : public QObject
return m_inputBufferFrames[ m_inputBufferRead ];
}

inline const surroundSampleFrame * nextBuffer()
inline const SampleFrame* nextBuffer()
{
return hasFifoWriter() ? m_fifo->read() : renderNextBuffer();
}
Expand All @@ -320,11 +311,11 @@ class LMMS_EXPORT AudioEngine : public QObject
signals:
void qualitySettingsChanged();
void sampleRateChanged();
void nextAudioBuffer( const lmms::surroundSampleFrame * buffer );
void nextAudioBuffer(const lmms::SampleFrame* buffer);


private:
using Fifo = FifoBuffer<surroundSampleFrame*>;
using Fifo = FifoBuffer<SampleFrame*>;

class fifoWriter : public QThread
{
Expand All @@ -341,7 +332,7 @@ class LMMS_EXPORT AudioEngine : public QObject

void run() override;

void write( surroundSampleFrame * buffer );
void write(SampleFrame* buffer);
} ;


Expand All @@ -360,7 +351,7 @@ class LMMS_EXPORT AudioEngine : public QObject
void renderStageEffects();
void renderStageMix();

const surroundSampleFrame * renderNextBuffer();
const SampleFrame* renderNextBuffer();

void swapBuffers();

Expand All @@ -374,14 +365,14 @@ class LMMS_EXPORT AudioEngine : public QObject

fpp_t m_framesPerPeriod;

sampleFrame * m_inputBuffer[2];
SampleFrame * m_inputBuffer[2];
f_cnt_t m_inputBufferFrames[2];
f_cnt_t m_inputBufferSize[2];
int m_inputBufferRead;
int m_inputBufferWrite;

surroundSampleFrame * m_outputBufferRead;
surroundSampleFrame * m_outputBufferWrite;
SampleFrame* m_outputBufferRead;
SampleFrame* m_outputBufferWrite;

// worker thread stuff
std::vector<AudioEngineWorkerThread *> m_workers;
Expand Down
2 changes: 1 addition & 1 deletion include/AudioFileFlac.h
Expand Up @@ -65,7 +65,7 @@ class AudioFileFlac : public AudioFileDevice
SF_INFO m_sfinfo;
SNDFILE* m_sf;

void writeBuffer(surroundSampleFrame const* _ab, fpp_t const frames) override;
void writeBuffer(const SampleFrame* _ab, fpp_t const frames) override;

bool startEncoding();
void finishEncoding();
Expand Down
2 changes: 1 addition & 1 deletion include/AudioFileMP3.h
Expand Up @@ -58,7 +58,7 @@ class AudioFileMP3 : public AudioFileDevice
}

protected:
void writeBuffer(const surroundSampleFrame* /* _buf*/, const fpp_t /*_frames*/) override;
void writeBuffer(const SampleFrame* /* _buf*/, const fpp_t /*_frames*/) override;

private:
void flushRemainingBuffers();
Expand Down
2 changes: 1 addition & 1 deletion include/AudioFileOgg.h
Expand Up @@ -58,7 +58,7 @@ class AudioFileOgg : public AudioFileDevice


private:
void writeBuffer(const surroundSampleFrame* _ab, const fpp_t _frames) override;
void writeBuffer(const SampleFrame* _ab, const fpp_t _frames) override;

bool startEncoding();
void finishEncoding();
Expand Down
2 changes: 1 addition & 1 deletion include/AudioFileWave.h
Expand Up @@ -56,7 +56,7 @@ class AudioFileWave : public AudioFileDevice


private:
void writeBuffer(const surroundSampleFrame* _ab, const fpp_t _frames) override;
void writeBuffer(const SampleFrame* _ab, const fpp_t _frames) override;

bool startEncoding();
void finishEncoding();
Expand Down
2 changes: 1 addition & 1 deletion include/AudioJack.h
Expand Up @@ -111,7 +111,7 @@ private slots:
std::atomic<MidiJack*> m_midiClient;
std::vector<jack_port_t*> m_outputPorts;
jack_default_audio_sample_t** m_tempOutBufs;
surroundSampleFrame* m_outBuf;
SampleFrame* m_outBuf;

f_cnt_t m_framesDoneInCurBuf;
f_cnt_t m_framesToDoInCurBuf;
Expand Down
4 changes: 2 additions & 2 deletions include/AudioPort.h
Expand Up @@ -46,7 +46,7 @@ class AudioPort : public ThreadableJob
BoolModel * mutedModel = nullptr );
virtual ~AudioPort();

inline sampleFrame * buffer()
inline SampleFrame * buffer()
{
return m_portBuffer;
}
Expand Down Expand Up @@ -112,7 +112,7 @@ class AudioPort : public ThreadableJob
private:
volatile bool m_bufferUsage;

sampleFrame * m_portBuffer;
SampleFrame * m_portBuffer;
QMutex m_portBufferLock;

bool m_extOutputEnabled;
Expand Down
2 changes: 1 addition & 1 deletion include/AudioPortAudio.h
Expand Up @@ -150,7 +150,7 @@ class AudioPortAudio : public AudioDevice

bool m_wasPAInitError;

surroundSampleFrame * m_outBuf;
SampleFrame* m_outBuf;
int m_outBufPos;
int m_outBufSize;

Expand Down
4 changes: 2 additions & 2 deletions include/AudioSampleRecorder.h
Expand Up @@ -48,9 +48,9 @@ class AudioSampleRecorder : public AudioDevice
std::shared_ptr<const SampleBuffer> createSampleBuffer();

private:
void writeBuffer(const surroundSampleFrame* _ab, const fpp_t _frames) override;
void writeBuffer(const SampleFrame* _ab, const fpp_t _frames) override;

using BufferList = QList<QPair<sampleFrame*, fpp_t>>;
using BufferList = QList<QPair<SampleFrame*, fpp_t>>;
BufferList m_buffers;

} ;
Expand Down
2 changes: 1 addition & 1 deletion include/AudioSdl.h
Expand Up @@ -85,7 +85,7 @@ class AudioSdl : public AudioDevice

SDL_AudioSpec m_audioHandle;

surroundSampleFrame * m_outBuf;
SampleFrame* m_outBuf;

#ifdef LMMS_HAVE_SDL2
size_t m_currentBufferFramePos;
Expand Down
2 changes: 1 addition & 1 deletion include/AudioSoundIo.h
Expand Up @@ -110,7 +110,7 @@ class AudioSoundIo : public AudioDevice
SoundIo *m_soundio;
SoundIoOutStream *m_outstream;

surroundSampleFrame * m_outBuf;
SampleFrame* m_outBuf;
int m_outBufSize;
fpp_t m_outBufFramesTotal;
fpp_t m_outBufFrameIndex;
Expand Down
12 changes: 5 additions & 7 deletions include/BufferManager.h
Expand Up @@ -32,20 +32,18 @@
namespace lmms
{

class SampleFrame;

class LMMS_EXPORT BufferManager
{
public:
static void init( fpp_t fpp );
static sampleFrame * acquire();
static SampleFrame * acquire();
// audio-buffer-mgm
static void clear( sampleFrame * ab, const f_cnt_t frames,
static void clear( SampleFrame * ab, const f_cnt_t frames,
const f_cnt_t offset = 0 );
#ifndef LMMS_DISABLE_SURROUND
static void clear( surroundSampleFrame * ab, const f_cnt_t frames,
const f_cnt_t offset = 0 );
#endif
static void release( sampleFrame * buf );

static void release( SampleFrame * buf );

private:
static fpp_t s_framesPerPeriod;
Expand Down
13 changes: 12 additions & 1 deletion include/DspEffectLibrary.h
Expand Up @@ -28,7 +28,7 @@
#include "lmms_math.h"
#include "lmms_constants.h"
#include "lmms_basics.h"

#include "SampleFrame.h"

namespace lmms::DspEffectLibrary
{
Expand Down Expand Up @@ -80,6 +80,17 @@ namespace lmms::DspEffectLibrary
{
}

void setGain(float gain)
{
leftFX().setGain(gain);
rightFX().setGain(gain);
}

void nextSample(SampleFrame & in)
{
nextSample(in.left(), in.right());
}

void nextSample( sample_t& inLeft, sample_t& inRight )
{
inLeft = m_leftFX.nextSample( inLeft );
Expand Down
2 changes: 1 addition & 1 deletion include/DummyEffect.h
Expand Up @@ -107,7 +107,7 @@ class DummyEffect : public Effect
return &m_controls;
}

bool processAudioBuffer( sampleFrame *, const fpp_t ) override
bool processAudioBuffer( SampleFrame *, const fpp_t ) override
{
return false;
}
Expand Down
5 changes: 2 additions & 3 deletions include/DummyInstrument.h
Expand Up @@ -49,10 +49,9 @@ class DummyInstrument : public Instrument

~DummyInstrument() override = default;

void playNote( NotePlayHandle *, sampleFrame * buffer ) override
void playNote( NotePlayHandle *, SampleFrame * buffer ) override
{
memset( buffer, 0, sizeof( sampleFrame ) *
Engine::audioEngine()->framesPerPeriod() );
zeroSampleFrames(buffer, Engine::audioEngine()->framesPerPeriod());
}

void saveSettings( QDomDocument &, QDomElement & ) override
Expand Down
14 changes: 7 additions & 7 deletions include/Effect.h
Expand Up @@ -64,7 +64,7 @@ class LMMS_EXPORT Effect : public Plugin
}


virtual bool processAudioBuffer( sampleFrame * _buf,
virtual bool processAudioBuffer( SampleFrame * _buf,
const fpp_t _frames ) = 0;

inline ch_cnt_t processorCount() const
Expand Down Expand Up @@ -187,8 +187,8 @@ class LMMS_EXPORT Effect : public Plugin

// some effects might not be capable of higher sample-rates so they can
// sample it down before processing and back after processing
inline void sampleDown( const sampleFrame * _src_buf,
sampleFrame * _dst_buf,
inline void sampleDown( const SampleFrame * _src_buf,
SampleFrame * _dst_buf,
sample_rate_t _dst_sr )
{
resample( 0, _src_buf,
Expand All @@ -197,8 +197,8 @@ class LMMS_EXPORT Effect : public Plugin
Engine::audioEngine()->framesPerPeriod() );
}

inline void sampleBack( const sampleFrame * _src_buf,
sampleFrame * _dst_buf,
inline void sampleBack( const SampleFrame * _src_buf,
SampleFrame * _dst_buf,
sample_rate_t _src_sr )
{
resample( 1, _src_buf, _src_sr, _dst_buf,
Expand All @@ -213,9 +213,9 @@ class LMMS_EXPORT Effect : public Plugin

private:
EffectChain * m_parent;
void resample( int _i, const sampleFrame * _src_buf,
void resample( int _i, const SampleFrame * _src_buf,
sample_rate_t _src_sr,
sampleFrame * _dst_buf, sample_rate_t _dst_sr,
SampleFrame * _dst_buf, sample_rate_t _dst_sr,
const f_cnt_t _frames );

ch_cnt_t m_processors;
Expand Down
3 changes: 2 additions & 1 deletion include/EffectChain.h
Expand Up @@ -34,6 +34,7 @@ namespace lmms
{

class Effect;
class SampleFrame;

namespace gui
{
Expand Down Expand Up @@ -62,7 +63,7 @@ class LMMS_EXPORT EffectChain : public Model, public SerializingObject
void removeEffect( Effect * _effect );
void moveDown( Effect * _effect );
void moveUp( Effect * _effect );
bool processAudioBuffer( sampleFrame * _buf, const fpp_t _frames, bool hasInputNoise );
bool processAudioBuffer( SampleFrame * _buf, const fpp_t _frames, bool hasInputNoise );
void startRunning();

void clear();
Expand Down