mirror of
https://github.com/ElvishArtisan/rivendell.git
synced 2025-04-07 17:32:20 +02:00
399 lines
7.3 KiB
C++
399 lines
7.3 KiB
C++
// rdsettings.cpp
|
|
//
|
|
// Audio Format Settings
|
|
//
|
|
// (C) Copyright 2002-2015 Fred Gleason <fredg@paravelsystems.com>
|
|
//
|
|
// This program is free software; you can redistribute it and/or modify
|
|
// it under the terms of the GNU General Public License version 2 as
|
|
// published by the Free Software Foundation.
|
|
//
|
|
// 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; if not, write to the Free Software
|
|
// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
//
|
|
|
|
#include <rdsettings.h>
|
|
#include <rddb.h>
|
|
#include <rdescape_string.h>
|
|
|
|
RDSettings::RDSettings()
|
|
{
|
|
clear();
|
|
}
|
|
|
|
|
|
RDSettings::Format RDSettings::format() const
|
|
{
|
|
return set_format;
|
|
}
|
|
|
|
|
|
void RDSettings::setFormat(Format format)
|
|
{
|
|
set_format=format;
|
|
}
|
|
|
|
|
|
QString RDSettings::formatName() const
|
|
{
|
|
return set_format_name;
|
|
}
|
|
|
|
|
|
void RDSettings::setFormatName(const QString &str)
|
|
{
|
|
set_format_name=str;
|
|
}
|
|
|
|
|
|
unsigned RDSettings::channels() const
|
|
{
|
|
return set_channels;
|
|
}
|
|
|
|
|
|
void RDSettings::setChannels(unsigned channels)
|
|
{
|
|
set_channels=channels;
|
|
}
|
|
|
|
|
|
unsigned RDSettings::sampleRate() const
|
|
{
|
|
return set_sample_rate;
|
|
}
|
|
|
|
|
|
void RDSettings::setSampleRate(unsigned rate)
|
|
{
|
|
set_sample_rate=rate;
|
|
}
|
|
|
|
|
|
unsigned RDSettings::layer() const
|
|
{
|
|
return set_layer;
|
|
}
|
|
|
|
|
|
void RDSettings::setLayer(unsigned layer)
|
|
{
|
|
set_layer=layer;
|
|
}
|
|
|
|
|
|
unsigned RDSettings::bitRate() const
|
|
{
|
|
return set_bit_rate;
|
|
}
|
|
|
|
|
|
void RDSettings::setBitRate(unsigned rate)
|
|
{
|
|
set_bit_rate=rate;
|
|
}
|
|
|
|
|
|
unsigned RDSettings::quality() const
|
|
{
|
|
return set_quality;
|
|
}
|
|
|
|
|
|
void RDSettings::setQuality(unsigned qual)
|
|
{
|
|
set_quality=qual;
|
|
}
|
|
|
|
|
|
int RDSettings::normalizationLevel() const
|
|
{
|
|
return set_normalization_level;
|
|
}
|
|
|
|
|
|
void RDSettings::setNormalizationLevel(int level)
|
|
{
|
|
set_normalization_level=level;
|
|
}
|
|
|
|
|
|
int RDSettings::autotrimLevel() const
|
|
{
|
|
return set_autotrim_level;
|
|
}
|
|
|
|
|
|
void RDSettings::setAutotrimLevel(int level)
|
|
{
|
|
set_autotrim_level=level;
|
|
}
|
|
|
|
|
|
QString RDSettings::description()
|
|
{
|
|
QString sql;
|
|
RDSqlQuery *q;
|
|
QString desc;
|
|
QString sr=QString().sprintf("%d S/sec",set_sample_rate);
|
|
switch(set_format) {
|
|
case RDSettings::Pcm16:
|
|
desc="PCM16, ";
|
|
break;
|
|
|
|
case RDSettings::MpegL1:
|
|
desc="MPEG L1, ";
|
|
if(set_bit_rate==0) {
|
|
desc+=QString().sprintf("Qual %d, ",set_quality);
|
|
}
|
|
else {
|
|
desc+=QString().sprintf("%d kbit/sec, ",set_bit_rate/1000);
|
|
}
|
|
break;
|
|
|
|
case RDSettings::MpegL2:
|
|
desc="MPEG L2, ";
|
|
if(set_bit_rate==0) {
|
|
desc+=QString().sprintf("Qual %d, ",set_quality);
|
|
}
|
|
else {
|
|
desc+=QString().sprintf("%d kbit/sec, ",set_bit_rate/1000);
|
|
}
|
|
break;
|
|
|
|
case RDSettings::MpegL3:
|
|
desc="MPEG L3, ";
|
|
if(set_bit_rate==0) {
|
|
desc+=QString().sprintf("Qual %d, ",set_quality);
|
|
}
|
|
else {
|
|
desc+=QString().sprintf("%d kbit/sec, ",set_bit_rate/1000);
|
|
}
|
|
break;
|
|
|
|
case RDSettings::Flac:
|
|
desc="FLAC, ";
|
|
break;
|
|
|
|
case RDSettings::OggVorbis:
|
|
desc=QString().sprintf("OggVorbis, Qual %d, ",set_quality);
|
|
break;
|
|
|
|
default: // Custom format
|
|
if(set_format_name.isEmpty()) {
|
|
sql=QString().sprintf("select NAME from ENCODERS where ID=%d",
|
|
set_format);
|
|
q=new RDSqlQuery(sql);
|
|
if(q->first()) {
|
|
set_format_name=q->value(0).toString();
|
|
}
|
|
else {
|
|
set_format_name="Unknown";
|
|
}
|
|
delete q;
|
|
}
|
|
desc=set_format_name+" ";
|
|
if(set_bit_rate>0) {
|
|
desc+=" "+QString().sprintf("%d kbit/sec, ",set_bit_rate/1000);
|
|
}
|
|
}
|
|
if(set_sample_rate>0) {
|
|
desc+=QString().sprintf("%d samp/sec, ",set_sample_rate);
|
|
}
|
|
switch(set_channels) {
|
|
case 1:
|
|
desc+="Mono";
|
|
break;
|
|
|
|
case 2:
|
|
desc+="Stereo";
|
|
break;
|
|
|
|
default:
|
|
desc+=QString().sprintf("%d chans",set_channels);
|
|
break;
|
|
}
|
|
return desc;
|
|
}
|
|
|
|
|
|
QString RDSettings::customCommandLine() const
|
|
{
|
|
return set_custom_command_line;
|
|
}
|
|
|
|
|
|
void RDSettings::setCustomCommandLine(const QString &str)
|
|
{
|
|
set_custom_command_line=str;
|
|
}
|
|
|
|
|
|
QString RDSettings::resolvedCustomCommandLine(const QString &destfile)
|
|
{
|
|
if(set_custom_command_line.isEmpty()) {
|
|
QString sql;
|
|
RDSqlQuery *q;
|
|
sql=QString().sprintf("select COMMAND_LINE from ENCODERS where ID=%d",
|
|
set_format);
|
|
q=new RDSqlQuery(sql);
|
|
if(q->first()) {
|
|
set_custom_command_line=q->value(0).toString();
|
|
}
|
|
delete q;
|
|
}
|
|
QString ret=set_custom_command_line;
|
|
|
|
ret.replace("%f",destfile);
|
|
ret.replace("%c",QString().sprintf("%u",set_channels));
|
|
ret.replace("%r",QString().sprintf("%u",set_sample_rate));
|
|
ret.replace("%b",QString().sprintf("%u",set_bit_rate));
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
QString RDSettings::pathName(const QString &stationname,QString pathname,
|
|
RDSettings::Format fmt)
|
|
{
|
|
QString ext;
|
|
int index=pathname.findRev(".");
|
|
if(index<0) {
|
|
return pathname+"."+defaultExtension(stationname,fmt);
|
|
}
|
|
ext=pathname.right(pathname.length()-index);
|
|
if(ext.lower()==defaultExtension(stationname,fmt)) {
|
|
return pathname;
|
|
}
|
|
return pathname.replace(index,ext.length(),"."+
|
|
defaultExtension(stationname,fmt));
|
|
}
|
|
|
|
|
|
QString RDSettings::defaultExtension(RDSettings::Format fmt)
|
|
{
|
|
QString ret="dat";
|
|
|
|
switch(fmt) {
|
|
case RDSettings::Pcm16:
|
|
case RDSettings::Pcm24:
|
|
case RDSettings::MpegL2Wav:
|
|
ret="wav";
|
|
break;
|
|
|
|
case RDSettings::MpegL1:
|
|
ret="mp1";
|
|
break;
|
|
|
|
case RDSettings::MpegL2:
|
|
ret="mp2";
|
|
break;
|
|
|
|
case RDSettings::MpegL3:
|
|
ret="mp3";
|
|
break;
|
|
|
|
case RDSettings::Flac:
|
|
ret="flac";
|
|
break;
|
|
|
|
case RDSettings::OggVorbis:
|
|
ret="ogg";
|
|
break;
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
|
|
QString RDSettings::defaultExtension(const QString &stationname,
|
|
RDSettings::Format fmt)
|
|
{
|
|
switch(fmt) {
|
|
case RDSettings::Pcm16:
|
|
case RDSettings::Pcm24:
|
|
case RDSettings::MpegL2Wav:
|
|
return QString("wav");
|
|
|
|
case RDSettings::MpegL1:
|
|
return QString("mp1");
|
|
|
|
case RDSettings::MpegL2:
|
|
return QString("mp2");
|
|
|
|
case RDSettings::MpegL3:
|
|
return QString("mp3");
|
|
|
|
case RDSettings::Flac:
|
|
return QString("flac");
|
|
|
|
case RDSettings::OggVorbis:
|
|
return QString("ogg");
|
|
}
|
|
|
|
//
|
|
// Custom Format
|
|
//
|
|
QString sql;
|
|
RDSqlQuery *q;
|
|
QString ret;
|
|
|
|
sql=QString().sprintf("select DEFAULT_EXTENSION from ENCODERS \
|
|
where (ID=%d)&&(STATION_NAME=\"%s\")",
|
|
fmt,(const char *)RDEscapeString(stationname));
|
|
q=new RDSqlQuery(sql);
|
|
if(q->first()) {
|
|
ret=q->value(0).toString();
|
|
}
|
|
delete q;
|
|
|
|
return ret;
|
|
}
|
|
|
|
|
|
unsigned RDSettings::bytesPerSec(const QString &stationname,
|
|
RDSettings::Format fmt,unsigned quality)
|
|
{
|
|
//
|
|
// Guesstimate the bit rate for a VBR encoding. This is *not* exact,
|
|
// but is intended merely to provide a half-way sane value for use with
|
|
// progress bars and such.
|
|
//
|
|
switch(fmt) {
|
|
case RDSettings::MpegL3:
|
|
return 16000;
|
|
break;
|
|
|
|
case RDSettings::OggVorbis:
|
|
return 4173*quality+7977;
|
|
break;
|
|
|
|
case RDSettings::Flac:
|
|
return 72500;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
|
|
void RDSettings::clear()
|
|
{
|
|
set_format=RDSettings::Pcm16;
|
|
set_format_name="";
|
|
set_channels=2;
|
|
set_sample_rate=48000;
|
|
set_bit_rate=0;
|
|
set_quality=0;
|
|
set_normalization_level=0;
|
|
set_autotrim_level=0;
|
|
set_custom_command_line="";
|
|
}
|