You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tderadio/kradio3/plugins/recording/recording-config.cpp

216 lines
7.2 KiB

/***************************************************************************
recording-config.cpp - description
-------------------
begin : Mi Apr 30 2005
copyright : (C) 2005 by Martin Witte
email : witte@kawo1.rwth-aachen.de
***************************************************************************/
/***************************************************************************
* *
* 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. *
* *
***************************************************************************/
#include "recording-config.h"
#include <sndfile.h>
RecordingConfig::RecordingConfig ()
: m_EncodeBufferSize(256*1024),
m_EncodeBufferCount(3),
m_mp3Quality(7),
m_oggQuality(1.0),
m_Directory("/tmp"),
m_OutputFormat(outputWAV),
m_PreRecordingEnable (false),
m_PreRecordingSeconds(10)
{
checkFormatSettings();
}
RecordingConfig::RecordingConfig (const TQString &directory,
OutputFormat of,
const SoundFormat &sf, int mp3_q, float ogg_q)
: m_EncodeBufferSize(256*1024),
m_EncodeBufferCount(3),
m_SoundFormat(sf),
m_mp3Quality(mp3_q),
m_oggQuality(ogg_q),
m_Directory(directory),
m_OutputFormat(of),
m_PreRecordingEnable (false),
m_PreRecordingSeconds(10)
{
checkFormatSettings();
}
RecordingConfig::RecordingConfig (const RecordingConfig &c)
:
m_EncodeBufferSize(c.m_EncodeBufferSize),
m_EncodeBufferCount(c.m_EncodeBufferCount),
m_SoundFormat(c.m_SoundFormat),
m_mp3Quality(c.m_mp3Quality),
m_oggQuality(c.m_oggQuality),
m_Directory(c.m_Directory),
m_OutputFormat(c.m_OutputFormat),
m_PreRecordingEnable (false),
m_PreRecordingSeconds(10)
{
checkFormatSettings();
}
void RecordingConfig::restoreConfig(KConfig *c)
{
m_EncodeBufferSize = c->readNumEntry("encodeBufferSize", 256*1024);
m_EncodeBufferCount = c->readNumEntry("encodeBufferCount", 3);
m_SoundFormat.restoreConfig("", c);
m_Directory = c->readEntry("directory", "/tmp");
m_mp3Quality = c->readNumEntry("mp3quality", 7);
m_oggQuality = c->readDoubleNumEntry("oggquality", 1.0);
TQString of = c->readEntry("outputFormat", ".wav");
if (of == ".wav")
m_OutputFormat = outputWAV;
else if (of == ".aiff")
m_OutputFormat = outputAIFF;
else if (of == ".au")
m_OutputFormat = outputAU;
#ifdef HAVE_LAME
else if (of == ".mp3")
m_OutputFormat = outputMP3;
#endif
#ifdef HAVE_OGG
else if (of == ".ogg")
m_OutputFormat = outputOGG;
#endif
else if (of == ".raw")
m_OutputFormat = outputRAW;
// if there was any unknown format
else
m_OutputFormat = outputWAV;
m_PreRecordingEnable = c->readBoolEntry("prerecording-enable", false);
m_PreRecordingSeconds = c->readNumEntry("prerecording-seconds", 10);
checkFormatSettings();
}
void RecordingConfig::saveConfig(KConfig *c) const
{
c->writeEntry("encodeBufferSize", m_EncodeBufferSize);
c->writeEntry("encodeBufferCount", m_EncodeBufferCount);
m_SoundFormat.saveConfig("", c);
c->writeEntry("directory", m_Directory);
c->writeEntry("mp3quality", m_mp3Quality);
c->writeEntry("oggquality", m_oggQuality);
switch(m_OutputFormat) {
case outputWAV: c->writeEntry("outputFormat", ".wav"); break;
case outputAIFF: c->writeEntry("outputFormat", ".aiff"); break;
case outputAU: c->writeEntry("outputFormat", ".au"); break;
case outputMP3: c->writeEntry("outputFormat", ".mp3"); break;
case outputOGG: c->writeEntry("outputFormat", ".ogg"); break;
case outputRAW: c->writeEntry("outputFormat", ".raw"); break;
default: c->writeEntry("outputFormat", ".wav"); break;
}
c->writeEntry("prerecording-enable", m_PreRecordingEnable);
c->writeEntry("prerecording-seconds", m_PreRecordingSeconds);
}
void RecordingConfig::getSoundFileInfo(SF_INFO &sinfo, bool input)
{
checkFormatSettings();
sinfo.samplerate = m_SoundFormat.m_SampleRate;
sinfo.channels = m_SoundFormat.m_Channels;
sinfo.format = 0;
sinfo.seekable = !input;
// U8 only supported for RAW and WAV
if (m_SoundFormat.m_SampleBits == 8) {
if ((m_SoundFormat.m_IsSigned &&
m_OutputFormat != outputWAV) ||
m_OutputFormat == outputAU
) {
sinfo.format |= SF_FORMAT_PCM_S8;
} else {
sinfo.format |= SF_FORMAT_PCM_U8;
}
}
if (m_SoundFormat.m_SampleBits == 16)
sinfo.format |= SF_FORMAT_PCM_16;
if (m_SoundFormat.m_Endianess == LITTLE_ENDIAN)
sinfo.format |= SF_ENDIAN_LITTLE;
else
sinfo.format |= SF_ENDIAN_BIG;
if (input) {
sinfo.format |= SF_FORMAT_RAW;
} else {
switch (m_OutputFormat) {
case outputWAV: sinfo.format |= SF_FORMAT_WAV; break;
case outputAIFF: sinfo.format |= SF_FORMAT_AIFF; break;
case outputAU: sinfo.format |= SF_FORMAT_AU; break;
case outputRAW: sinfo.format |= SF_FORMAT_RAW; break;
default: sinfo.format |= SF_FORMAT_WAV; break;
}
}
}
void RecordingConfig::checkFormatSettings()
{
// correct Endianess and Signs for specific formats
switch (m_OutputFormat) {
case outputWAV:
m_SoundFormat.m_Endianess = LITTLE_ENDIAN;
if (m_SoundFormat.m_SampleBits == 8)
m_SoundFormat.m_IsSigned = false;
// libsndfile only supports signed 16 bit samples
if (m_SoundFormat.m_SampleBits == 16)
m_SoundFormat.m_IsSigned = true;
break;
case outputAIFF:
m_SoundFormat.m_Endianess = BIG_ENDIAN;
// libsndfile only supports signed 16 bit samples
if (m_SoundFormat.m_SampleBits == 16)
m_SoundFormat.m_IsSigned = true;
break;
case outputAU:
m_SoundFormat.m_Endianess = BIG_ENDIAN;
m_SoundFormat.m_IsSigned = true;
// libsndfile only supports signed 16 bit samples
if (m_SoundFormat.m_SampleBits == 16)
m_SoundFormat.m_IsSigned = true;
break;
case outputMP3:
m_SoundFormat.m_IsSigned = true;
m_SoundFormat.m_SampleBits = 16;
break;
case outputOGG:
m_SoundFormat.m_IsSigned = true;
m_SoundFormat.m_SampleBits = 16;
break;
case outputRAW:
// libsndfile only supports signed 16 bit samples
if (m_SoundFormat.m_SampleBits == 16)
m_SoundFormat.m_IsSigned = true;
break;
default:
break;
}
}