added FLAC as an export format
This commit is contained in:
125
src/core/audio/audio_file_flac.cpp
Normal file
125
src/core/audio/audio_file_flac.cpp
Normal file
@@ -0,0 +1,125 @@
|
||||
/*
|
||||
* audio_file_flac.cpp - Audio-device which encodes a flac stream and writes it
|
||||
* into a flac file. This is used for song-export.
|
||||
*
|
||||
* Copyright (c) 2009 Andrew Kelley <superjoe30@gmail.com>
|
||||
*
|
||||
* This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net
|
||||
*
|
||||
* 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.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "audio_file_flac.h"
|
||||
|
||||
#include <QtDebug>
|
||||
|
||||
#include "lmms_basics.h"
|
||||
|
||||
|
||||
|
||||
AudioFileFlac::AudioFileFlac( const sample_rate_t _sample_rate,
|
||||
const ch_cnt_t _channels, bool & _success_ful, const QString & _file,
|
||||
const bool _use_vbr, const bitrate_t _nom_bitrate,
|
||||
const bitrate_t _min_bitrate, const bitrate_t _max_bitrate,
|
||||
const int _depth, mixer * _mixer ) :
|
||||
audioFileDevice( _sample_rate, _channels, _file, _use_vbr, _nom_bitrate,
|
||||
_min_bitrate, _max_bitrate, _depth, _mixer )
|
||||
{
|
||||
_success_ful = startEncoding();
|
||||
}
|
||||
|
||||
|
||||
bool AudioFileFlac::startEncoding( void )
|
||||
{
|
||||
// check the encoder
|
||||
if( ! m_encoder )
|
||||
{
|
||||
qWarning() << "AudioFileFlac: unable to allocate encoder";
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ok = true;
|
||||
|
||||
ok &= m_encoder.set_verify(true);
|
||||
ok &= m_encoder.set_compression_level(5);
|
||||
ok &= m_encoder.set_channels(channels());
|
||||
ok &= m_encoder.set_bits_per_sample(16);
|
||||
ok &= m_encoder.set_sample_rate(sampleRate());
|
||||
//ok &= encoder.set_total_samples_estimate(??);
|
||||
|
||||
if( ! ok ) return false;
|
||||
|
||||
// TODO: set metadata: http://flac.cvs.sourceforge.net/viewvc/flac/flac/examples/cpp/encode/file/main.cpp?view=markup
|
||||
|
||||
|
||||
// initialize encoder
|
||||
FLAC__StreamEncoderInitStatus init_status = m_encoder.init(
|
||||
outputFile().toAscii());
|
||||
if( init_status != FLAC__STREAM_ENCODER_INIT_STATUS_OK )
|
||||
{
|
||||
qWarning() << "AudioFileFlac: unable to initialize encoder:" <<
|
||||
FLAC__StreamEncoderInitStatusString[init_status];
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
|
||||
Sint16 AudioFileFlac::rescale(float sample) {
|
||||
return (qMax<float>(qMin<float>(sample, 1), -1) / 1)
|
||||
* std::numeric_limits<Sint16>::max();
|
||||
}
|
||||
|
||||
|
||||
// encode data and write to file
|
||||
void AudioFileFlac::writeBuffer( const surroundSampleFrame * _ab,
|
||||
const fpp_t _frames, const float _master_gain )
|
||||
{
|
||||
// scale to short int instead of float
|
||||
FLAC__int32 * in = new FLAC__int32[_frames*channels()];
|
||||
|
||||
for(int i=0; i < _frames; ++i)
|
||||
{
|
||||
for(int c=0; c < channels(); ++c)
|
||||
{
|
||||
in[i*channels()+c] = (FLAC__int32) rescale( _ab[i][c]
|
||||
* _master_gain );
|
||||
}
|
||||
}
|
||||
|
||||
// feed to the encoder
|
||||
m_encoder.process_interleaved(in, _frames);
|
||||
|
||||
// clean up
|
||||
delete[] in;
|
||||
}
|
||||
|
||||
|
||||
void AudioFileFlac::finishEncoding( void )
|
||||
{
|
||||
m_encoder.finish();
|
||||
}
|
||||
|
||||
|
||||
AudioFileFlac::~AudioFileFlac()
|
||||
{
|
||||
finishEncoding();
|
||||
}
|
||||
|
||||
/* vim: set tw=0 noexpandtab: */
|
||||
@@ -160,7 +160,7 @@ int main( int argc, char * * argv )
|
||||
"-r, --render <project file> render given project file\n"
|
||||
"-o, --output <file> render into <file>\n"
|
||||
"-f, --output-format <format> specify format of render-output where\n"
|
||||
" format is either 'wav', 'ogg', or 'mp3'.\n"
|
||||
" format is either 'wav', 'ogg', 'mp3', or 'flac'.\n"
|
||||
"-s, --samplerate <samplerate> specify output samplerate in Hz\n"
|
||||
" range: 44100 (default) to 192000\n"
|
||||
"-b, --bitrate <bitrate> specify output bitrate in kHz\n"
|
||||
@@ -229,6 +229,12 @@ int main( int argc, char * * argv )
|
||||
{
|
||||
eff = projectRenderer::Mp3File;
|
||||
}
|
||||
#ifdef LMMS_HAVE_FLAC
|
||||
else if( ext == "flac" )
|
||||
{
|
||||
eff = projectRenderer::FlacFile;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
printf( "\nInvalid output format %s.\n\n"
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include "audio_file_wave.h"
|
||||
#include "audio_file_ogg.h"
|
||||
#include "audio_file_mp3.h"
|
||||
#include "audio_file_flac.h"
|
||||
|
||||
#ifdef LMMS_HAVE_PTHREAD_H
|
||||
#include <pthread.h>
|
||||
@@ -58,6 +59,15 @@ fileEncodeDevice __fileEncodeDevices[] =
|
||||
{ projectRenderer::Mp3File,
|
||||
QT_TRANSLATE_NOOP( "projectRenderer", "MP3 File (*.mp3)" ),
|
||||
".mp3", &AudioFileMp3::getInst },
|
||||
{ projectRenderer::FlacFile,
|
||||
QT_TRANSLATE_NOOP( "projectRenderer", "FLAC File (*.flac)" ),
|
||||
".flac",
|
||||
#ifdef LMMS_HAVE_FLAC
|
||||
&AudioFileFlac::getInst
|
||||
#else
|
||||
NULL
|
||||
#endif
|
||||
},
|
||||
// ... insert your own file-encoder-infos here... may be one day the
|
||||
// user can add own encoders inside the program...
|
||||
|
||||
@@ -65,7 +75,7 @@ fileEncodeDevice __fileEncodeDevices[] =
|
||||
|
||||
} ;
|
||||
|
||||
const char * projectRenderer::EFF_ext[] = {"wav", "ogg", "mp3"};
|
||||
const char * projectRenderer::EFF_ext[] = {"wav", "ogg", "mp3", "flac"};
|
||||
|
||||
|
||||
projectRenderer::projectRenderer( const mixer::qualitySettings & _qs,
|
||||
|
||||
Reference in New Issue
Block a user