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

Remove audio engine from exporting code #7452

Draft
wants to merge 70 commits into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
2ac8a9c
AudioEngine_adding_new_export_classes
szeli1 Aug 14, 2024
d4d19d7
AudioFileDevice_removing_AudioEngine_and_AudioDevice
szeli1 Aug 14, 2024
9bb6b5e
AudioFileFlac_updating_constructors_part_1
szeli1 Aug 14, 2024
377e3f4
AudioFileMP3_updating_constructors_part_1
szeli1 Aug 14, 2024
738e0ba
AudioFileOgg_updating_constructors_part_1
szeli1 Aug 14, 2024
092e9cd
AudioFileWave_updating_constructors_part_1
szeli1 Aug 14, 2024
22f162e
AudioDevice_audiobuffering_made_static
szeli1 Aug 14, 2024
1d6d47f
ProjectRenderer_updating_m_FileDev_constructor
szeli1 Aug 14, 2024
ccab40a
AudioEngine_moving_processing_function
szeli1 Aug 14, 2024
a5b44f1
AudioFileDevice_removing_processNextBuffer_function
szeli1 Aug 14, 2024
d5c6efd
AudioFileFlac_updating_constructor_part_2
szeli1 Aug 14, 2024
7733c47
AudioFileMP3_updating_constructor_part_2
szeli1 Aug 14, 2024
934571d
AudioFileOgg_updating_constructor_part_2
szeli1 Aug 14, 2024
f5436f8
AudioFileWave_updating_constructor_part_2
szeli1 Aug 14, 2024
80f9dd6
ProjectRenderer_removing_Project_code
szeli1 Aug 14, 2024
d78d614
RenderManager_adding_project_code
szeli1 Aug 14, 2024
3ad71bb
RenderManager_fixing_endRendering_function
szeli1 Aug 14, 2024
4e56afa
AudioAlsa_updating_convertToS16
szeli1 Aug 14, 2024
85e7a1e
AudioOss_updating_convertToS16
szeli1 Aug 14, 2024
2813474
AudioPulseAudio_updating_convertToS16
szeli1 Aug 14, 2024
f7a8173
AudioSndio_updating_convertToS16
szeli1 Aug 14, 2024
8788800
ExportProjcetDialog_replacing_ProjectRenderer
szeli1 Aug 14, 2024
b7fd2d6
ProjectRenderer_renaming_to_ActiveRenderer
szeli1 Aug 14, 2024
b6cc6f5
ActiveRenderer_renaming_ProjectRenderer
szeli1 Aug 14, 2024
3dfbfa1
RenderManager_renaming_ProjectRenderer
szeli1 Aug 14, 2024
7f9ab91
AudioEngine_renaming_ProjectRenderer
szeli1 Aug 14, 2024
183b2fb
CMakeLists_renaming_ProjectRenderer
szeli1 Aug 14, 2024
5c80787
main_renaming_ProjecRenderer
szeli1 Aug 14, 2024
e3d7fe1
MainWindow_renaming_ProjectRenderer
szeli1 Aug 14, 2024
866108a
AciveRenderer_RenderManager_AudioFileDevice_AudioFileFlac_removing_qD…
szeli1 Aug 15, 2024
65daca0
RenderManager_updating_comments
szeli1 Aug 15, 2024
141cb23
RenderManager_replacing_memcpy
szeli1 Aug 15, 2024
6dbea74
main_rename_ProjectRenderer
szeli1 Aug 16, 2024
025fdef
MainWindow_rename_ProjectRenderer
szeli1 Aug 16, 2024
cba148b
ExportProjectDialog_rename_ProjectRenderer
szeli1 Aug 16, 2024
ca9b374
RenderManager_rename_ProjectRenderer
szeli1 Aug 16, 2024
05aba7c
CMakeLists_rename_ProjectRenderer
szeli1 Aug 16, 2024
f48664a
ActiveRenderer_renamed_to_ProjectRenderer
szeli1 Aug 16, 2024
5d13640
ProjectRenderer_renamed_ActiveRenderer
szeli1 Aug 16, 2024
53a2a44
CMakeLists_adding_new_file
szeli1 Aug 20, 2024
c873d01
LmmsExporter_adding_files
szeli1 Aug 20, 2024
dba5dd1
LmmsExporter_implementing_functions
szeli1 Aug 21, 2024
35b1d23
LmmsExporter_implementing_functions_2
szeli1 Aug 22, 2024
0207f38
ProjectRenderer_reset_file
szeli1 Aug 22, 2024
cc1094a
RenderManager_reset_file
szeli1 Aug 22, 2024
73ee235
RenderManager_implement_LmmsExporter
szeli1 Aug 22, 2024
ef3807e
ProjectRenderer_implement_LmmsExporter
szeli1 Aug 22, 2024
67858ca
AudioEngine_friend_class_ProjectRenderer
szeli1 Aug 22, 2024
639cdc6
ExportProjectDialog_implement_LmmsExporter
szeli1 Aug 22, 2024
9313778
LmmsExporter_fix_errors
szeli1 Aug 22, 2024
502b287
main_implement_LmmsExporter
szeli1 Aug 22, 2024
61a0639
MainWindow_implement_LmmsExporter
szeli1 Aug 22, 2024
f548f74
AudioAlsa_reset
szeli1 Aug 23, 2024
821130d
AudioSndio_reset
szeli1 Aug 23, 2024
a0ff26d
AudioOss_reset
szeli1 Aug 23, 2024
8abbfd2
AudioPulseAudio_reset
szeli1 Aug 23, 2024
57db1ee
AudioDevice_channel_count_set_to_2_in_static
szeli1 Aug 23, 2024
1ecffa6
AudioFileDevice_remove_channel_count
szeli1 Aug 23, 2024
ec51c9a
AudioFileFlac_remove_channel_count
szeli1 Aug 23, 2024
d3fb596
AudioFileMP3_remove_channel_count
szeli1 Aug 23, 2024
061235f
AudioFileOgg_remove_channel_count
szeli1 Aug 23, 2024
ca9f6da
AudioFileWave_remove_channel_count
szeli1 Aug 23, 2024
a8071e3
LmmsExporter_remove_channel_count_from_AudioFileDevice
szeli1 Aug 23, 2024
1ac6c93
AudioDevice_format_changes
szeli1 Aug 23, 2024
a15b34e
AudioFileFlac_fromat_changes
szeli1 Aug 23, 2024
c61209c
AudioFileDevice_format_changes
szeli1 Aug 23, 2024
db7e52d
AudioFileMP3_format_changes
szeli1 Aug 23, 2024
ffdb807
AudioFileOgg_format_changes
szeli1 Aug 23, 2024
f0cf93d
AudioFileWave_format_changes
szeli1 Aug 23, 2024
ff0c79f
LmmsExporter_format_changes
szeli1 Aug 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions include/AudioDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -90,26 +90,26 @@ class AudioDevice

virtual void stopProcessing();

protected:
// subclasses can re-implement this for being used in conjunction with
// processNextBuffer()
virtual void writeBuffer(const SampleFrame* /* _buf*/, const fpp_t /*_frames*/) {}

// called by according driver for fetching new sound-data
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 SampleFrame* _ab,
static int convertToS16(const SampleFrame* _ab,
const fpp_t _frames,
int_sample_t * _output_buffer,
const bool _convert_endian = false );

// clear given signed-int-16-buffer
void clearS16Buffer( int_sample_t * _outbuf,
const fpp_t _frames );
static void clearS16Buffer(int_sample_t * _outbuf,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
static void clearS16Buffer(int_sample_t * _outbuf,
static void clearS16Buffer(int_sample_t* _outbuf,

const fpp_t _frames);
protected:
// subclasses can re-implement this for being used in conjunction with
// processNextBuffer()
virtual void writeBuffer(const SampleFrame* /* _buf*/, const fpp_t /*_frames*/) {}

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

inline void setSampleRate( const sample_rate_t _new_sr )
inline void setSampleRate(const sample_rate_t _new_sr)
{
m_sampleRate = _new_sr;
}
Expand Down
2 changes: 2 additions & 0 deletions include/AudioEngine.h
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,8 @@ class LMMS_EXPORT AudioEngine : public QObject
void startProcessing(bool needsFifo = true);
void stopProcessing();

void startExporting(const struct qualitySettings& qs);


AudioDevice * tryAudioDevices();
MidiClient * tryMidiClients();
Expand Down
30 changes: 24 additions & 6 deletions include/AudioFileDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,19 +28,23 @@

#include <QFile>

#include "AudioDevice.h"
#include "OutputSettings.h"

namespace lmms
{

class AudioFileDevice : public AudioDevice
class SampleFrame;

class AudioFileDevice
{
public:
// getBufferFunction
using BufferFn = std::function<void(SampleFrame*, fpp_t*, fpp_t)>;

AudioFileDevice(OutputSettings const & outputSettings,
const ch_cnt_t _channels, const QString & _file,
AudioEngine* audioEngine );
~AudioFileDevice() override;
const QString & _file,
const fpp_t defaultBufferSize);
virtual ~AudioFileDevice();

QString outputFile() const
{
Expand All @@ -49,8 +53,20 @@ class AudioFileDevice : public AudioDevice

OutputSettings const & getOutputSettings() const { return m_outputSettings; }

sample_rate_t getSampleRate();
// how many samples to store in a buffer
const fpp_t getDefaultFrameCount();

void setSampleRate(sample_rate_t newSampleRate);

// save audio
void processThisBuffer(SampleFrame* frameBuffer, const fpp_t frameCount);


protected:
// subclasses can re-implement this for being used in conjunction with
virtual void writeBuffer(const SampleFrame* /* _buf*/, const fpp_t /*_frames*/) {}

int writeData( const void* data, int len );

inline bool outputFileOpened() const
Expand All @@ -66,10 +82,12 @@ class AudioFileDevice : public AudioDevice
private:
QFile m_outputFile;
OutputSettings m_outputSettings;

const fpp_t m_defaultFrameCount;
} ;

using AudioFileDeviceInstantiaton
= AudioFileDevice* (*)(const QString&, const OutputSettings&, const ch_cnt_t, AudioEngine*, bool&);
= AudioFileDevice* (*)(const OutputSettings&, bool&, const QString&, const fpp_t);

} // namespace lmms

Expand Down
20 changes: 8 additions & 12 deletions include/AudioFileFlac.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,26 +37,22 @@ class AudioFileFlac : public AudioFileDevice
{
public:
AudioFileFlac(OutputSettings const& outputSettings,
ch_cnt_t const channels,
bool& successful,
QString const& file,
AudioEngine* audioEngine
);

const QString& file,
const fpp_t defaultBufferSize);
~AudioFileFlac() override;

static AudioFileDevice* getInst(QString const& outputFilename,
OutputSettings const& outputSettings,
ch_cnt_t const channels,
AudioEngine* audioEngine,
bool& successful)
static AudioFileDevice* getInst(
OutputSettings const &outputSettings,
bool &successful,
const QString & outputFilename,
const fpp_t defaultBufferSize)
{
return new AudioFileFlac(
outputSettings,
channels,
successful,
outputFilename,
audioEngine
defaultBufferSize
);
}

Expand Down
27 changes: 15 additions & 12 deletions include/AudioFileMP3.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,21 +40,24 @@ namespace lmms
class AudioFileMP3 : public AudioFileDevice
{
public:
AudioFileMP3( OutputSettings const & outputSettings,
const ch_cnt_t _channels,
bool & successful,
const QString & _file,
AudioEngine* audioEngine );
AudioFileMP3(OutputSettings const& outputSettings,
bool& successful,
const QString& file,
const fpp_t defaultBufferSize);
~AudioFileMP3() override;

static AudioFileDevice * getInst( const QString & outputFilename,
OutputSettings const & outputSettings,
const ch_cnt_t channels,
AudioEngine* audioEngine,
bool & successful )
static AudioFileDevice* getInst(
OutputSettings const &outputSettings,
bool &successful,
const QString & outputFilename,
const fpp_t defaultBufferSize)
{
return new AudioFileMP3( outputSettings, channels, successful,
outputFilename, audioEngine );
return new AudioFileMP3(
outputSettings,
successful,
outputFilename,
defaultBufferSize
);
}

protected:
Expand Down
26 changes: 15 additions & 11 deletions include/AudioFileOgg.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,24 @@ namespace lmms
class AudioFileOgg : public AudioFileDevice
{
public:
AudioFileOgg( OutputSettings const & outputSettings,
const ch_cnt_t _channels,
bool & _success_ful,
const QString & _file,
AudioEngine* audioEngine );
AudioFileOgg(OutputSettings const& outputSettings,
bool& successful,
const QString& file,
const fpp_t defaultBufferSize);
~AudioFileOgg() override;

static AudioFileDevice * getInst( const QString & outputFilename,
OutputSettings const & outputSettings,
const ch_cnt_t channels,
AudioEngine* audioEngine,
bool & successful )
static AudioFileDevice* getInst(
OutputSettings const &outputSettings,
bool &successful,
const QString & outputFilename,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const QString & outputFilename,
const QString& outputFilename,

const fpp_t defaultBufferSize)
{
return new AudioFileOgg( outputSettings, channels, successful, outputFilename, audioEngine );
return new AudioFileOgg(
outputSettings,
successful,
outputFilename,
defaultBufferSize
);
}


Expand Down
27 changes: 15 additions & 12 deletions include/AudioFileWave.h
Original file line number Diff line number Diff line change
Expand Up @@ -37,21 +37,24 @@ namespace lmms
class AudioFileWave : public AudioFileDevice
{
public:
AudioFileWave( OutputSettings const & outputSettings,
const ch_cnt_t channels,
bool & successful,
const QString & file,
AudioEngine* audioEngine );
AudioFileWave(OutputSettings const& outputSettings,
bool& successful,
const QString& file,
const fpp_t defaultBufferSize);
~AudioFileWave() override;

static AudioFileDevice * getInst( const QString & outputFilename,
OutputSettings const & outputSettings,
const ch_cnt_t channels,
AudioEngine* audioEngine,
bool & successful )
static AudioFileDevice* getInst(
OutputSettings const &outputSettings,
bool &successful,
const QString & outputFilename,
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
const QString & outputFilename,
const QString& outputFilename,

const fpp_t defaultBufferSize)
{
return new AudioFileWave( outputSettings, channels, successful,
outputFilename, audioEngine );
return new AudioFileWave(
outputSettings,
successful,
outputFilename,
defaultBufferSize
);
}


Expand Down
2 changes: 1 addition & 1 deletion include/ExportProjectDialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ private slots:
QString m_fileExtension;
bool m_multiExport;

ProjectRenderer::ExportFileFormat m_ft;
LmmsExporter::ExportAudioFileFormat m_ft;
std::unique_ptr<RenderManager> m_renderManager;
} ;

Expand Down
130 changes: 130 additions & 0 deletions include/LmmsExporter.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
/*
* LmmsExporter.h - exporting files (currently only audio files), TODO rename class when things change
*
* Copyright (c) 2024 szeli1 <TODO/at/gmail/dot.com>
*
* This file is part of LMMS - https://lmms.io
*
* 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 COPYING); if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301 USA.
*
*/

#ifndef LMMS_LMMS_EXPORTER_H
#define LMMS_LMMS_EXPORTER_H

#include <functional>
#include <thread>
#include <vector>

#include "AudioFileDevice.h"
#include "SampleFrame.h"

namespace lmms
{
class LmmsExporter
{
public:
using BufferFn = std::function<void(std::vector<SampleFrame>*, void*)>;
using EndFn = std::function<void(void*)>;

enum class ExportAudioFileFormat : int
{
Wave,
Flac,
Ogg,
MP3,
Count
};
// in the future more types can be added
enum class ExportFileType
{
Audio
};

constexpr static auto NumFileFormats = static_cast<std::size_t>(ExportAudioFileFormat::Count);

struct FileEncodeDevice
{
bool isAvailable() const { return m_getDevInst != nullptr; }

ExportAudioFileFormat m_fileFormat;
const char* m_description;
const char* m_extension;
AudioFileDeviceInstantiaton m_getDevInst;
};

LmmsExporter(const ExportFileType fileType,
const QString& outputLocationAndName);
~LmmsExporter();

void setupAudioRendering(
const OutputSettings& outputSettings,
ExportAudioFileFormat fileFormat,
const fpp_t defaultFrameCount,
SampleFrame* exportBuffer,
const fpp_t exportBufferFrameCount);
void setupAudioRendering(
const OutputSettings& outputSettings,
ExportAudioFileFormat fileFormat,
const fpp_t defaultFrameCount,
BufferFn getBufferFunction,
EndFn endFunction,
void* getBufferData);
bool canExportAutioFile() const;

static ExportAudioFileFormat getAudioFileFormatFromFileName(const QString& fileName);
static ExportAudioFileFormat getAudioFileFormatFromExtension(const QString& extenisonString);
static QString getAudioFileExtensionFromFormat(ExportAudioFileFormat fmt);

static const std::array<FileEncodeDevice, 5> s_fileEncodeDevices;

void startExporting();
void stopExporting();

private:
static void processExportingAudioFile(LmmsExporter* thisExporter);

// audio exporting
bool processNextBuffer();
bool processThisBuffer(SampleFrame* frameBuffer, const fpp_t frameCount);
void setupAudioRenderingInternal(
const OutputSettings& outputSettings,
ExportAudioFileFormat fileFormat,
const fpp_t defaultFrameCount);



ExportFileType m_exportFileType;
QString m_outputFile;

volatile bool m_abort;

// called if not nullptr
// while run()
// if returned buffer.size() <= 0 then break; end
BufferFn m_getBufferFunction;
// called at the end of run(), can be nullptr
EndFn m_endFunction;
void* m_getBufferData;

AudioFileDevice* m_fileDev;
std::vector<SampleFrame> m_buffer;
std::unique_ptr<std::thread> m_thread;
};

} // namespace lmms

#endif // LMMS_LMMS_EXPORTER_H
Loading
Loading