From 8d70a793875dcf1e7ef341933fca61f0acffbe4f Mon Sep 17 00:00:00 2001 From: Fred Gleason Date: Sun, 30 Aug 2015 07:49:44 -0400 Subject: [PATCH] 2015-08-29 Fred Gleason * Added an 'RDAudioConvert::Stage3Pcm24()' method in 'lib/rdaudioconvert.cpp' and 'lib/rdaudioconvert.h'. * Added a 'Format::Pcm24' value to the 'RDSettings::Format' enumeration in 'lib/rdsettings.h'. * Modified the 'RDAudioConvert' class to support generating PCM24 output in 'lib/rdaudioconvert.cpp' and 'lib/rdaudioconvert.h'. * Modified the 'RDPlayStream' class to support playing PCM24 data in 'rdhpi/rdplaystream.cpp'. * Modified the 'RDRecordStream' class to support capturing PCM24 data in 'rdhpi/rdrecordstream.cpp'. * Added an 'audio_peaks_test' harness in 'tests/audio_peaks_test.cpp' and 'tests/audio_peaks_test.h'. * Added 'PCM24' to the list of available formats in 'rdadmin/edit_rdlibrary.cpp' and 'rdadmin/edit_rdlibrary.h'. * Added 'PCM24' to the list of available formats in 'rdadmin/edit_decks.cpp'. * Added PCM24 support for file importation in 'web/rdxport/import.cpp'. * Added an 'RDCae::Pcm24' value to the 'RDCae::AudioCoding enumeration in 'lib/rdcae.h'. --- .gitignore | 1 + ChangeLog | 21 ++ cae/cae.cpp | 4 +- cae/cae_hpi.cpp | 9 +- docs/cae.sxw | Bin 15896 -> 24036 bytes lib/rdaudioconvert.cpp | 59 +++- lib/rdaudioconvert.h | 6 +- lib/rdaudioimport.cpp | 4 +- lib/rdaudioimport.h | 4 +- lib/rdcae.cpp | 4 +- lib/rdcae.h | 6 +- lib/rdsettings.cpp | 33 ++- lib/rdsettings.h | 8 +- lib/rdwavefile.cpp | 430 ++++++++++++++++------------ lib/rdwavefile.h | 16 +- rdadmin/edit_decks.cpp | 37 ++- rdadmin/edit_rdlibrary.cpp | 401 ++++++++++++++------------- rdadmin/edit_rdlibrary.h | 7 +- rdadmin/rdadmin_cs.ts | 16 +- rdadmin/rdadmin_de.ts | 16 +- rdadmin/rdadmin_es.ts | 16 +- rdadmin/rdadmin_fr.ts | 24 +- rdadmin/rdadmin_nb.ts | 16 +- rdadmin/rdadmin_nn.ts | 16 +- rdadmin/rdadmin_pt_BR.ts | 16 +- rdcatch/rdcatch.cpp | 524 +++++++++++++++++++---------------- rdcatch/rdcatch_cs.ts | 4 + rdcatch/rdcatch_de.ts | 4 + rdcatch/rdcatch_es.ts | 4 + rdcatch/rdcatch_fr.ts | 4 + rdcatch/rdcatch_nb.ts | 4 + rdcatch/rdcatch_nn.ts | 4 + rdcatch/rdcatch_pt_BR.ts | 4 + rdcatchd/batch.cpp | 8 +- rdcatchd/rdcatchd.cpp | 88 ++++-- rdhpi/rdhpiplaystream.cpp | 16 ++ rdhpi/rdhpirecordstream.cpp | 201 ++++++++------ rdhpi/rdhpirecordstream.h | 4 +- rdlibrary/record_cut.cpp | 5 + tests/Makefile.am | 4 + tests/audio_convert_test.cpp | 5 +- tests/audio_convert_test.h | 6 +- tests/audio_peaks_test.cpp | 85 ++++++ tests/audio_peaks_test.h | 35 +++ web/rdxport/import.cpp | 4 + 45 files changed, 1329 insertions(+), 854 deletions(-) create mode 100644 tests/audio_peaks_test.cpp create mode 100644 tests/audio_peaks_test.h diff --git a/.gitignore b/.gitignore index aa78975f..8604c138 100644 --- a/.gitignore +++ b/.gitignore @@ -33,3 +33,4 @@ rivendell rivendell-suse rivendell.spec slack-desc +tests/audio_peaks_test diff --git a/ChangeLog b/ChangeLog index 86a5fcf3..f8247b1a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -14834,3 +14834,24 @@ * Removed instrumentation code in 'rdairplay/rlmhost.cpp'. 2015-08-29 Fred Gleason * Incremented the package version to 2.10.3caefix06. +2015-08-29 Fred Gleason + * Added an 'RDAudioConvert::Stage3Pcm24()' method in + 'lib/rdaudioconvert.cpp' and 'lib/rdaudioconvert.h'. + * Added a 'Format::Pcm24' value to the 'RDSettings::Format' + enumeration in 'lib/rdsettings.h'. + * Modified the 'RDAudioConvert' class to support generating PCM24 + output in 'lib/rdaudioconvert.cpp' and 'lib/rdaudioconvert.h'. + * Modified the 'RDPlayStream' class to support playing PCM24 + data in 'rdhpi/rdplaystream.cpp'. + * Modified the 'RDRecordStream' class to support capturing PCM24 + data in 'rdhpi/rdrecordstream.cpp'. + * Added an 'audio_peaks_test' harness in 'tests/audio_peaks_test.cpp' + and 'tests/audio_peaks_test.h'. + * Added 'PCM24' to the list of available formats in + 'rdadmin/edit_rdlibrary.cpp' and 'rdadmin/edit_rdlibrary.h'. + * Added 'PCM24' to the list of available formats in + 'rdadmin/edit_decks.cpp'. + * Added PCM24 support for file importation in + 'web/rdxport/import.cpp'. + * Added an 'RDCae::Pcm24' value to the 'RDCae::AudioCoding + enumeration in 'lib/rdcae.h'. diff --git a/cae/cae.cpp b/cae/cae.cpp index a9854bba..60af0186 100644 --- a/cae/cae.cpp +++ b/cae/cae.cpp @@ -2,9 +2,7 @@ // // The Core Audio Engine component of Rivendell // -// (C) Copyright 2002-2004 Fred Gleason -// -// $Id: cae.cpp,v 1.115.4.3 2012/11/30 16:14:57 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 diff --git a/cae/cae_hpi.cpp b/cae/cae_hpi.cpp index a53fb8b7..b0135f01 100644 --- a/cae/cae_hpi.cpp +++ b/cae/cae_hpi.cpp @@ -176,6 +176,7 @@ bool MainObject::hpiLoadRecord(int card,int stream,int coding,int chans, int samprate,int bitrate,QString wavename) { #ifdef HPI + syslog(LOG_NOTICE,"card: %d coding: %d\n",card,coding); record[card][stream]=new RDHPIRecordStream(sound_card); connect(record[card][stream],SIGNAL(stateChanged(int,int,int)), this,SLOT(stateRecordUpdate(int,int,int))); @@ -188,7 +189,7 @@ bool MainObject::hpiLoadRecord(int card,int stream,int coding,int chans, record[card][stream]->setFormatTag(WAVE_FORMAT_PCM); record[card][stream]->setBitsPerSample(16); } - if((coding>=1)&&(coding<=2)) { // MPEG-1 + if((coding==1)||(coding==2)) { // MPEG-1 record[card][stream]->setFormatTag(WAVE_FORMAT_MPEG); record[card][stream]->setHeadLayer(coding); record[card][stream]->setHeadBitRate(bitrate); @@ -207,7 +208,11 @@ bool MainObject::hpiLoadRecord(int card,int stream,int coding,int chans, } record[card][stream]->setHeadFlags(ACM_MPEG_ID_MPEG1); } - if(coding>2) { + if(coding==4) { // PCM24 + record[card][stream]->setFormatTag(WAVE_FORMAT_PCM); + record[card][stream]->setBitsPerSample(24); + } + if(coding>4) { delete record[card][stream]; record[card][stream]=NULL; return false; diff --git a/docs/cae.sxw b/docs/cae.sxw index 1bc7f55b8807d9217ab5ea5df97da46600a75d08..b32c034a647ac1a1ac5e993907f80fe2411e9a94 100644 GIT binary patch literal 24036 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 z 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 diff --git a/lib/rdaudioconvert.cpp b/lib/rdaudioconvert.cpp index 1d0512b1..0f4afb94 100644 --- a/lib/rdaudioconvert.cpp +++ b/lib/rdaudioconvert.cpp @@ -2,9 +2,7 @@ // // Convert Audio File Formats // -// (C) Copyright 2010 Fred Gleason -// -// $Id: rdaudioconvert.cpp,v 1.14.2.3.2.1 2014/05/15 16:30:00 cvs Exp $ +// (C) Copyright 2010-2015 Fred Gleason // // 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 @@ -20,6 +18,7 @@ // Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. // +#include #include #include #include @@ -964,6 +963,10 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Convert(const QString &srcfile, ret=Stage3Pcm16(src_sf,&src_sf_info,dstfile); break; + case RDSettings::Pcm24: + ret=Stage3Pcm24(src_sf,&src_sf_info,dstfile); + break; + case RDSettings::MpegL2: ret=Stage3Layer2(src_sf,&src_sf_info,dstfile); break; @@ -1612,7 +1615,6 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Pcm16(SNDFILE *src_sf, RDWaveFile *wave=new RDWaveFile(dstfile); wave->setFormatTag(WAVE_FORMAT_PCM); - wave->setEncoding(RDWaveFile::Signed16Int); wave->setChannels(src_sf_info->channels); wave->setSamplesPerSec(src_sf_info->samplerate); wave->setBitsPerSample(16); @@ -1645,6 +1647,55 @@ RDAudioConvert::ErrorCode RDAudioConvert::Stage3Pcm16(SNDFILE *src_sf, } +RDAudioConvert::ErrorCode RDAudioConvert::Stage3Pcm24(SNDFILE *src_sf, + SF_INFO *src_sf_info, + const QString &dstfile) +{ + int *sf_buffer=NULL; + uint8_t *pcm24=NULL; + ssize_t n; + + RDWaveFile *wave=new RDWaveFile(dstfile); + wave->setFormatTag(WAVE_FORMAT_PCM); + wave->setChannels(src_sf_info->channels); + wave->setSamplesPerSec(src_sf_info->samplerate); + wave->setBitsPerSample(24); + wave->setBextChunk(true); + wave->setCartChunk(conv_dst_wavedata!=NULL); + if((conv_dst_wavedata!=NULL)&&(conv_settings->normalizationLevel()!=0)) { + wave->setCartLevelRef(32768* + exp10((double)conv_settings->normalizationLevel()/20.0)); + } + wave->setLevlChunk(true); + sf_buffer=new int[2048*src_sf_info->channels]; + pcm24=new uint8_t[2048*src_sf_info->channels*sizeof(int)]; + unlink(dstfile); + if(!wave->createWave(conv_dst_wavedata)) { + return RDAudioConvert::ErrorNoDestination; + } + while((n=sf_readf_int(src_sf,sf_buffer,2048))>0) { + for(ssize_t i=0;i<(n*src_sf_info->channels);i++) { + pcm24[3*i]=0xFF&(sf_buffer[i]>>8); + pcm24[3*i+1]=0xFF&(sf_buffer[i]>>16); + pcm24[3*i+2]=0xFF&(sf_buffer[i]>>24); + } + if((unsigned)wave->writeWave(pcm24,n*3*src_sf_info->channels)!= + (n*3*src_sf_info->channels)) { + delete sf_buffer; + delete pcm24; + wave->closeWave(); + delete wave; + return RDAudioConvert::ErrorNoSpace; + } + } + delete sf_buffer; + delete pcm24; + wave->closeWave(); + delete wave; + return RDAudioConvert::ErrorOk; +} + + void RDAudioConvert::ApplyId3Tag(const QString &filename,RDWaveData *wavedata) { ID3_Tag *tag=new ID3_Tag(filename); diff --git a/lib/rdaudioconvert.h b/lib/rdaudioconvert.h index 3b833c9a..1d3bbfbb 100644 --- a/lib/rdaudioconvert.h +++ b/lib/rdaudioconvert.h @@ -2,9 +2,7 @@ // // Convert Audio File Formats // -// (C) Copyright 2010 Fred Gleason -// -// $Id: rdaudioconvert.h,v 1.4.4.1 2012/09/06 19:47:15 cvs Exp $ +// (C) Copyright 2010-2015 Fred Gleason // // 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 @@ -90,6 +88,8 @@ class RDAudioConvert : public QObject const QString &dstfile); RDAudioConvert::ErrorCode Stage3Pcm16(SNDFILE *src_sf,SF_INFO *src_sf_info, const QString &dstfile); + RDAudioConvert::ErrorCode Stage3Pcm24(SNDFILE *src_sf,SF_INFO *src_sf_info, + const QString &dstfile); void ApplyId3Tag(const QString &filename,RDWaveData *wavedata); void UpdatePeak(const float data[],ssize_t len); void UpdatePeak(const double data[],ssize_t len); diff --git a/lib/rdaudioimport.cpp b/lib/rdaudioimport.cpp index d6959780..816e58fa 100644 --- a/lib/rdaudioimport.cpp +++ b/lib/rdaudioimport.cpp @@ -2,9 +2,7 @@ // // Import an Audio File using the RdXport Web Service // -// (C) Copyright 2010 Fred Gleason -// -// $Id: rdaudioimport.cpp,v 1.12.4.4 2014/01/15 19:56:32 cvs Exp $ +// (C) Copyright 2010-2014 Fred Gleason // // 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 diff --git a/lib/rdaudioimport.h b/lib/rdaudioimport.h index ca288c00..bf484b97 100644 --- a/lib/rdaudioimport.h +++ b/lib/rdaudioimport.h @@ -2,9 +2,7 @@ // // Import an Audio File using the RdXport Web Service // -// (C) Copyright 2010 Fred Gleason -// -// $Id: rdaudioimport.h,v 1.4.4.1 2013/11/13 23:36:30 cvs Exp $ +// (C) Copyright 2010-2014 Fred Gleason // // 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 diff --git a/lib/rdcae.cpp b/lib/rdcae.cpp index 2e44e8fe..5c288849 100644 --- a/lib/rdcae.cpp +++ b/lib/rdcae.cpp @@ -2,9 +2,7 @@ // // Connection to the Rivendell Core Audio Engine // -// (C) Copyright 2002-2004 Fred Gleason -// -// $Id: rdcae.cpp,v 1.59.4.5 2013/11/14 02:04:57 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 diff --git a/lib/rdcae.h b/lib/rdcae.h index cbb0b32c..1945d686 100644 --- a/lib/rdcae.h +++ b/lib/rdcae.h @@ -2,9 +2,7 @@ // // Connection to the Rivendell Core Audio Engine // -// (C) Copyright 2002-2004 Fred Gleason -// -// $Id: rdcae.h,v 1.32.4.2 2012/11/30 16:14:59 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 @@ -43,7 +41,7 @@ class RDCae : public QObject enum ClockSource {InternalClock=0,AesEbuClock=1,SpDiffClock=2,WordClock=4}; enum ChannelMode {Normal=0,Swap=1,LeftOnly=2,RightOnly=3}; enum SourceType {Analog=0,AesEbu=1}; - enum AudioCoding {Pcm16=0,MpegL1=1,MpegL2=2,MpegL3=3}; + enum AudioCoding {Pcm16=0,MpegL1=1,MpegL2=2,MpegL3=3,Pcm24=4}; RDCae(RDStation *station,RDConfig *config, QObject *parent=0,const char *name=0); ~RDCae(); diff --git a/lib/rdsettings.cpp b/lib/rdsettings.cpp index 30566aa9..e23e23a3 100644 --- a/lib/rdsettings.cpp +++ b/lib/rdsettings.cpp @@ -1,10 +1,8 @@ // rdsettings.cpp // -// RDLibrary Settings +// Audio Format Settings // -// (C) Copyright 2002 Fred Gleason -// -// $Id: rdsettings.cpp,v 1.11.8.1 2012/12/13 22:33:44 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 @@ -282,24 +280,25 @@ QString RDSettings::defaultExtension(const QString &stationname, RDSettings::Format fmt) { switch(fmt) { - case RDSettings::Pcm16: - case RDSettings::MpegL2Wav: - return QString("wav"); + case RDSettings::Pcm16: + case RDSettings::Pcm24: + case RDSettings::MpegL2Wav: + return QString("wav"); - case RDSettings::MpegL1: - return QString("mp1"); + case RDSettings::MpegL1: + return QString("mp1"); - case RDSettings::MpegL2: - return QString("mp2"); + case RDSettings::MpegL2: + return QString("mp2"); - case RDSettings::MpegL3: - return QString("mp3"); + case RDSettings::MpegL3: + return QString("mp3"); - case RDSettings::Flac: - return QString("flac"); + case RDSettings::Flac: + return QString("flac"); - case RDSettings::OggVorbis: - return QString("ogg"); + case RDSettings::OggVorbis: + return QString("ogg"); } // diff --git a/lib/rdsettings.h b/lib/rdsettings.h index a6ec603e..412cdc22 100644 --- a/lib/rdsettings.h +++ b/lib/rdsettings.h @@ -1,10 +1,8 @@ // rdsettings.h // -// Rivendell Audio Settings +// Audio Format Settings // -// (C) Copyright 2002-2003 Fred Gleason -// -// $Id: rdsettings.h,v 1.11 2010/07/29 19:32:34 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 @@ -29,7 +27,7 @@ class RDSettings { public: enum Format {Pcm16=0,MpegL1=1,MpegL2=2,MpegL3=3,Flac=4,OggVorbis=5, - MpegL2Wav=6}; + MpegL2Wav=6,Pcm24=7}; RDSettings(); RDSettings::Format format() const; void setFormat(Format format); diff --git a/lib/rdwavefile.cpp b/lib/rdwavefile.cpp index cf18a5cd..85f7574f 100644 --- a/lib/rdwavefile.cpp +++ b/lib/rdwavefile.cpp @@ -1,10 +1,8 @@ // rdwavefile.cpp // -// A class for handling Microsoft WAV files. +// A class for handling audio files. // -// (C) Copyright 2002-2008 Fred Gleason -// -// $Id: rdwavefile.cpp,v 1.24.6.5.2.3 2014/07/15 20:02:23 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // This program is free software; you can redistribute it and/or modify // it under the terms of the GNU Library General Public License @@ -162,7 +160,6 @@ RDWaveFile::RDWaveFile(QString file_name) levl_block_size=DEFAULT_LEVL_BLOCK_SIZE; cook_buffer=NULL; cook_buffer_size=0; - cook_encoding=RDWaveFile::Raw; wave_type=RDWaveFile::Unknown; encode_quality=5.0f; serial_number=-1; @@ -800,7 +797,6 @@ void RDWaveFile::closeWave(int samples) free(cook_buffer); cook_buffer=NULL; cook_buffer_size=0; - cook_encoding=RDWaveFile::Raw; encode_quality=5.0f; serial_number=-1; atx_offset=0; @@ -869,18 +865,6 @@ unsigned RDWaveFile::getDataLength() const } -RDWaveFile::Encoding RDWaveFile::encoding() const -{ - return cook_encoding; -} - - -void RDWaveFile::setEncoding(RDWaveFile::Encoding code) -{ - cook_encoding=code; -} - - int RDWaveFile::readWave(void *buf,int count) { int stream; @@ -944,115 +928,182 @@ int RDWaveFile::writeWave(void *buf,int count) return -1; } switch(format_tag) { - case WAVE_FORMAT_PCM: - if(levl_chunk) { - for(int i=0;ienergy_data[energy_data.size()-1]) { - energy_data[energy_data.size()-1]=levl_accum; - } - if(++levl_block_ptr==1152) { - energy_data.push_back(0); - levl_block_ptr=0; - } - levl_istate=0; - break; - - case 2: - if(levl_accum>energy_data[energy_data.size()-2]) { - energy_data[energy_data.size()-2]=levl_accum; - } - levl_istate=2; - break; - } - break; - - case 2: // Right Channel, LSB - levl_accum=((char *)buf)[i]&0xff; - levl_istate=3; - break; - - case 3: // Right Channel, MSB - levl_accum|=((((char *)buf)[i]&0xff)<<8); - if(levl_accum>energy_data[energy_data.size()-1]) { - energy_data[energy_data.size()-1]=levl_accum; - } - if(++levl_block_ptr==1152) { - energy_data.push_back(0); - energy_data.push_back(0); - levl_block_ptr=0; - } - levl_istate=0; - break; - } - } - } - lseek(wave_file.handle(),0,SEEK_END); - data_length+=count; - // Fixup the buffer for big endian hosts (Wav is defined as LE). - if (htonl (1l) == 1l){ // Big endian host - for(int i = 0; i < count/2; i++) { - unsigned short s = ((unsigned short*)buf)[i]; - WriteSword((unsigned char *)buf,2*i,s); - } - } - return write(wave_file.handle(),buf,count); - - case WAVE_FORMAT_MPEG: - if(levl_chunk&&(head_layer==2)) { - for(int i=0;ienergy_data[energy_data.size()-1]) { + energy_data[energy_data.size()-1]=levl_accum; } + if(++levl_block_ptr==1152) { + energy_data.push_back(0); + levl_block_ptr=0; + } + levl_istate=0; + break; + + case 2: + if(levl_accum>energy_data[energy_data.size()-2]) { + energy_data[energy_data.size()-2]=levl_accum; + } + levl_istate=2; + break; + } + break; + + case 2: // Right Channel, LSB + levl_accum=((char *)buf)[i]&0xff; + levl_istate=3; + break; + + case 3: // Right Channel, MSB + levl_accum|=((((char *)buf)[i]&0xff)<<8); + if(levl_accum>energy_data[energy_data.size()-1]) { + energy_data[energy_data.size()-1]=levl_accum; + } + if(++levl_block_ptr==1152) { + energy_data.push_back(0); + energy_data.push_back(0); + levl_block_ptr=0; + } + levl_istate=0; + break; + } + } + } + lseek(wave_file.handle(),0,SEEK_END); + data_length+=count; + // Fixup the buffer for big endian hosts (Wav is defined as LE). + if (htonl (1l) == 1l){ // Big endian host + for(int i = 0; i < count/2; i++) { + unsigned short s = ((unsigned short*)buf)[i]; + WriteSword((unsigned char *)buf,2*i,s); + } + } + return write(wave_file.handle(),buf,count); + + case 24: + if(levl_chunk) { + for(int i=0;ienergy_data[energy_data.size()-1]) { + energy_data[energy_data.size()-1]=levl_accum; + } + if(++levl_block_ptr==1152) { + energy_data.push_back(0); + levl_block_ptr=0; + } + levl_istate=0; + break; + + case 2: + if(levl_accum>energy_data[energy_data.size()-2]) { + energy_data[energy_data.size()-2]=levl_accum; + } + levl_istate=3; + break; + } + break; + + case 3: // Right Channel, LSB + levl_istate=4; + break; + + case 4: // Right Channel, Middle + levl_accum=((char *)buf)[i]&0xff; + levl_istate=5; + break; + + case 5: // Right Channel, MSB + levl_accum|=((((char *)buf)[i]&0xff)<<8); + if(levl_accum>energy_data[energy_data.size()-1]) { + energy_data[energy_data.size()-1]=levl_accum; + } + if(++levl_block_ptr==1152) { + energy_data.push_back(0); + energy_data.push_back(0); + levl_block_ptr=0; + } + levl_istate=0; + break; + } + } + } + lseek(wave_file.handle(),0,SEEK_END); + data_length+=count; + return write(wave_file.handle(),buf,count); + } + + case WAVE_FORMAT_MPEG: + if(levl_chunk&&(head_layer==2)) { + for(int i=0;ienergy_data[i]) { - energy_data[i]=pcm[offset]+256*pcm[offset+1]; - } - } - i++; - } + case WAVE_FORMAT_PCM: + switch(bits_per_sample) { + case 16: + block_size=2304*channels; + while(ienergy_data[i]) { + energy_data[i]=pcm[offset]+256*pcm[offset+1]; + } + } + i++; + } + } + has_energy=true; + return i; + + case 24: + block_size=3456*channels; + while(ienergy_data[i]) { + energy_data[i]=pcm[offset]+256*pcm[offset+1]; + } + } + i++; + } + } + has_energy=true; + return i; + } + break; + + case WAVE_FORMAT_VORBIS: + block_size=2304*channels; + while(ienergy_data[i]) { - energy_data[i]=pcm[offset]+256*pcm[offset+1]; - } - } - i++; + } + for(int j=0;jenergy_data[i]) { + energy_data[i]=pcm[offset]+256*pcm[offset+1]; } } - has_energy=true; - return i; - break; + i++; + } + } + has_energy=true; + return i; + break; - default: - has_energy=false; - return 0; - break; + default: + has_energy=false; + return 0; + break; } + return 0; } diff --git a/lib/rdwavefile.h b/lib/rdwavefile.h index fbe4cfc1..6d0cece5 100644 --- a/lib/rdwavefile.h +++ b/lib/rdwavefile.h @@ -112,9 +112,8 @@ using namespace std; class RDWaveFile { public: - enum Encoding {Raw=0,Signed16Int=1,Signed32Float=2}; enum Format {Pcm8=0,Pcm16=1,Float32=2,MpegL1=3,MpegL2=4,MpegL3=5, - DolbyAc2=6,DolbyAc3=7,Vorbis=8}; + DolbyAc2=6,DolbyAc3=7,Vorbis=8,Pcm24=9}; enum Type {Unknown=0,Wave=1,Mpeg=2,Ogg=3,Atx=4,Tmc=5,Flac=6,Ambos=7, Aiff=8}; enum MpegID {NonMpeg=0,Mpeg1=1,Mpeg2=2}; @@ -217,17 +216,6 @@ class RDWaveFile **/ unsigned getDataLength() const; - /** - * Returns the current encoding type. - **/ - RDWaveFile::Encoding encoding() const; - - /** - * Set the encoding type. - * @param code The encoding to use. - **/ - void setEncoding(RDWaveFile::Encoding code); - /** * Read a block of data from the DATA chunk, using the current * encoding type. @@ -1205,7 +1193,7 @@ class RDWaveFile unsigned char *cook_buffer; int cook_buffer_size; - RDWaveFile::Encoding cook_encoding; + // RDWaveFile::Encoding cook_encoding; float encode_quality; int serial_number; int atx_offset; diff --git a/rdadmin/edit_decks.cpp b/rdadmin/edit_decks.cpp index 841e1563..9473ad5f 100644 --- a/rdadmin/edit_decks.cpp +++ b/rdadmin/edit_decks.cpp @@ -2,7 +2,7 @@ // // Edit a Rivendell RDCatch Deck Configuration // -// (C) Copyright 2002-2004,2014 Fred Gleason +// (C) Copyright 2002-2015 Fred Gleason // // 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 @@ -295,6 +295,7 @@ EditDecks::EditDecks(RDStation *station,RDStation *cae_station,QWidget *parent) edit_record_channel=edit_record_deck_box->currentItem()+1; edit_play_channel=edit_play_deck_box->currentItem()+129; edit_format_box->insertItem(tr("PCM16")); + edit_format_box->insertItem(tr("PCM24")); edit_format_box->insertItem(tr("MPEG Layer 2")); edit_channels_box->insertItem("1"); edit_channels_box->insertItem("2"); @@ -395,14 +396,14 @@ void EditDecks::monitorPortChangedData(int port) void EditDecks::formatActivatedData(int index) { - if(index==0) { - edit_bitrate_label->setDisabled(true); - edit_bitrate_box->setDisabled(true); - } - else { + if(index==2) { edit_bitrate_label->setEnabled(true); edit_bitrate_box->setEnabled(true); } + else { + edit_bitrate_label->setDisabled(true); + edit_bitrate_box->setDisabled(true); + } } @@ -529,9 +530,14 @@ void EditDecks::ReadRecord(int chan) edit_bitrate_box->setDisabled(true); break; + case RDSettings::Pcm24: + edit_format_box->setCurrentItem(1); + edit_bitrate_box->setDisabled(true); + break; + case RDSettings::MpegL2: case RDSettings::MpegL2Wav: - edit_format_box->setCurrentItem(1); + edit_format_box->setCurrentItem(2); edit_bitrate_box->setEnabled(true); break; @@ -638,12 +644,17 @@ void EditDecks::WriteRecord(int chan) } } switch(edit_format_box->currentItem()) { - case 0: - edit_record_deck->setDefaultFormat(RDSettings::Pcm16); - break; - case 1: - edit_record_deck->setDefaultFormat(RDSettings::MpegL2); - break; + case 0: + edit_record_deck->setDefaultFormat(RDSettings::Pcm16); + break; + + case 1: + edit_record_deck->setDefaultFormat(RDSettings::Pcm24); + break; + + case 2: + edit_record_deck->setDefaultFormat(RDSettings::MpegL2); + break; } edit_record_deck->setDefaultChannels(edit_channels_box->currentItem()+1); sscanf((const char *)edit_bitrate_box->currentText(),"%d",&temp); diff --git a/rdadmin/edit_rdlibrary.cpp b/rdadmin/edit_rdlibrary.cpp index 1747d3a6..a0d36d78 100644 --- a/rdadmin/edit_rdlibrary.cpp +++ b/rdadmin/edit_rdlibrary.cpp @@ -2,9 +2,7 @@ // // Edit an RDLibrary Configuration // -// (C) Copyright 2002-2003 Fred Gleason -// -// $Id: edit_rdlibrary.cpp,v 1.33.6.1 2014/01/09 01:03:55 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 @@ -41,8 +39,8 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station, - QWidget *parent,const char *name) - : QDialog(parent,name,true) + QWidget *parent) + : QDialog(parent,"",true) { // // Fix the Window Size @@ -65,7 +63,7 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station, // // Text Validator // - RDTextValidator *validator=new RDTextValidator(this,"validator"); + RDTextValidator *validator=new RDTextValidator(this); // // Dialog Name @@ -75,9 +73,9 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station, // // Input Configuration // - lib_input_card=new RDCardSelector(this,"lib_input_card"); + lib_input_card=new RDCardSelector(this); lib_input_card->setGeometry(10,29,120,117); - QLabel *label=new QLabel(lib_input_card,tr("INPUT"),this,"lib_input_label"); + QLabel *label=new QLabel(lib_input_card,tr("INPUT"),this); label->setGeometry(10,10,110,19); label->setFont(big_font); label->setAlignment(AlignCenter); @@ -85,9 +83,9 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station, // // Output Configuration // - lib_output_card=new RDCardSelector(this,"lib_output_card"); + lib_output_card=new RDCardSelector(this); lib_output_card->setGeometry(170,29,120,87); - label=new QLabel(lib_output_card,tr("OUTPUT"),this,"lib_output_label"); + label=new QLabel(lib_output_card,tr("OUTPUT"),this); label->setGeometry(170,10,110,19); label->setFont(big_font); label->setAlignment(AlignCenter); @@ -95,7 +93,7 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station, // // Settings // - QLabel *setting_label=new QLabel(tr("Settings"),this,"setting_label"); + QLabel *setting_label=new QLabel(tr("Settings"),this); setting_label->setGeometry(25,79,120,19); setting_label->setFont(big_font); setting_label->setAlignment(AlignRight|ShowPrefix); @@ -103,159 +101,147 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station, // // Maximum Record Length // - lib_maxlength_time=new QTimeEdit(this,"lib_maxlength_time"); + lib_maxlength_time=new QTimeEdit(this); lib_maxlength_time->setGeometry(160,100,85,19); - QLabel *lib_maxlength_label=new QLabel(lib_maxlength_time, - tr("&Max Record Time:"),this, - "lib_maxlength_label"); + QLabel *lib_maxlength_label= + new QLabel(lib_maxlength_time,tr("&Max Record Time:"),this); lib_maxlength_label->setGeometry(25,101,130,19); lib_maxlength_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); // // VOX threshold // - lib_vox_spin=new QSpinBox(this,"lib_vox_spin"); + lib_vox_spin=new QSpinBox(this); lib_vox_spin->setGeometry(160,122,40,19); lib_vox_spin->setMinValue(-99); lib_vox_spin->setMaxValue(0); - QLabel *lib_vox_spin_label=new QLabel(lib_vox_spin,tr("&VOX Threshold:"), - this,"lib_vox_spin_label"); + QLabel *lib_vox_spin_label= + new QLabel(lib_vox_spin,tr("&VOX Threshold:"),this); lib_vox_spin_label->setGeometry(25,122,130,19); lib_vox_spin_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); - QLabel *lib_vox_spin_unit=new QLabel(tr("dbFS"),this,"lib_vox_spin_unit"); + QLabel *lib_vox_spin_unit=new QLabel(tr("dbFS"),this); lib_vox_spin_unit->setGeometry(205,122,120,19); lib_vox_spin_unit->setAlignment(AlignLeft|AlignVCenter|ShowPrefix); // // AutoTrim threshold // - lib_trim_spin=new QSpinBox(this,"lib_trim_spin"); + lib_trim_spin=new QSpinBox(this); lib_trim_spin->setGeometry(160,144,40,19); lib_trim_spin->setMinValue(-99); lib_trim_spin->setMaxValue(0); QLabel *lib_trim_spin_label= - new QLabel(lib_trim_spin,tr("&AutoTrim Threshold:"), - this,"lib_trim_spin_label"); + new QLabel(lib_trim_spin,tr("&AutoTrim Threshold:"),this); lib_trim_spin_label->setGeometry(25,144,130,19); lib_trim_spin_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); - QLabel *lib_trim_spin_unit=new QLabel(tr("dbFS"),this,"lib_trim_spin_unit"); + QLabel *lib_trim_spin_unit=new QLabel(tr("dbFS"),this); lib_trim_spin_unit->setGeometry(205,144,120,19); lib_trim_spin_unit->setAlignment(AlignLeft|AlignVCenter|ShowPrefix); // // Tail Preroll // - lib_preroll_spin=new QSpinBox(this,"lib_preroll_spin"); + lib_preroll_spin=new QSpinBox(this); lib_preroll_spin->setGeometry(160,166,50,19); lib_preroll_spin->setMinValue(0); lib_preroll_spin->setMaxValue(10000); lib_preroll_spin->setLineStep(100); - QLabel *lib_preroll_spin_label=new QLabel(lib_preroll_spin, - tr("&Tail Preroll:"),this, - "lib_preroll_spin_label"); + QLabel *lib_preroll_spin_label= + new QLabel(lib_preroll_spin,tr("&Tail Preroll:"),this); lib_preroll_spin_label->setGeometry(25,166,130,19); lib_preroll_spin_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); - QLabel *lib_preroll_spin_unit=new QLabel(tr("milliseconds"),this, - "lib_preroll_spin_unit"); + QLabel *lib_preroll_spin_unit=new QLabel(tr("milliseconds"),this); lib_preroll_spin_unit->setGeometry(215,166,120,19); lib_preroll_spin_unit->setAlignment(AlignLeft|AlignVCenter|ShowPrefix); // // Ripper Device // - lib_ripdev_edit=new QLineEdit(this,"lib_ripper_device"); + lib_ripdev_edit=new QLineEdit(this); lib_ripdev_edit->setGeometry(160,188,100,19); lib_ripdev_edit->setValidator(validator); - QLabel *lib_ripdev_label=new QLabel(lib_ripdev_edit,tr("&Ripper Device:"), - this,"lib_format_label"); + QLabel *lib_ripdev_label= + new QLabel(lib_ripdev_edit,tr("&Ripper Device:"),this); lib_ripdev_label->setGeometry(25,188,130,19); lib_ripdev_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); // // Paranoia Level // - lib_paranoia_box=new QComboBox(this,"lib_paranoia_box"); + lib_paranoia_box=new QComboBox(this); lib_paranoia_box->setGeometry(160,210,100,19); QLabel *lib_paranoia_label= - new QLabel(lib_paranoia_box,tr("&Paranoia Level:"), - this,"lib_paranoia_label"); + new QLabel(lib_paranoia_box,tr("&Paranoia Level:"),this); lib_paranoia_label->setGeometry(25,210,130,19); lib_paranoia_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); // // Ripper Level // - lib_riplevel_spin=new QSpinBox(this,"lib_riplevel_spin"); + lib_riplevel_spin=new QSpinBox(this); lib_riplevel_spin->setGeometry(160,232,40,19); lib_riplevel_spin->setMinValue(-99); lib_riplevel_spin->setMaxValue(0); - QLabel *lib_riplevel_spin_label=new QLabel(lib_riplevel_spin, - tr("Ripper Level:"),this, - "lib_riplevel_spin_label"); + QLabel *lib_riplevel_spin_label= + new QLabel(lib_riplevel_spin,tr("Ripper Level:"),this); lib_riplevel_spin_label->setGeometry(25,232,130,19); lib_riplevel_spin_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); - QLabel *lib_riplevel_spin_unit=new QLabel(tr("dbFS"), - this,"lib_riplevel_spin_unit"); + QLabel *lib_riplevel_spin_unit=new QLabel(tr("dbFS"),this); lib_riplevel_spin_unit->setGeometry(205,232,120,19); lib_riplevel_spin_unit->setAlignment(AlignLeft|AlignVCenter|ShowPrefix); // // FreeDB Server // - lib_cddb_edit=new QLineEdit(this,"lib_cddb_edit"); + lib_cddb_edit=new QLineEdit(this); lib_cddb_edit->setGeometry(160,256,160,19); lib_cddb_edit->setValidator(validator); - QLabel *lib_cddb_label=new QLabel(lib_cddb_edit,tr("&FreeDB Server:"),this, - "lib_cddb_label"); + QLabel *lib_cddb_label=new QLabel(lib_cddb_edit,tr("&FreeDB Server:"),this); lib_cddb_label->setGeometry(25,256,130,19); lib_cddb_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); // // Format // - lib_format_box=new QComboBox(this,"lib_format_box"); + lib_format_box=new QComboBox(this); lib_format_box->setGeometry(160,280,150,19); connect(lib_format_box,SIGNAL(activated(int)),this,SLOT(formatData(int))); - QLabel *lib_format_label=new QLabel(lib_format_box,tr("&Format:"),this, - "lib_format_label"); + QLabel *lib_format_label=new QLabel(lib_format_box,tr("&Format:"),this); lib_format_label->setGeometry(25,280,130,19); lib_format_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); // // Bitrate // - lib_bitrate_box=new QComboBox(this,"lib_bitrate_box"); + lib_bitrate_box=new QComboBox(this); lib_bitrate_box->setGeometry(160,304,130,19); - QLabel *lib_bitrate_label=new QLabel(lib_bitrate_box,tr("&Bitrate:"),this, - "lib_bitrate_label"); + QLabel *lib_bitrate_label=new QLabel(lib_bitrate_box,tr("&Bitrate:"),this); lib_bitrate_label->setGeometry(25,304,130,19); lib_bitrate_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); // // Enable Editor // - lib_editor_box=new QComboBox(this,"lib_editor_box"); + lib_editor_box=new QComboBox(this); lib_editor_box->setGeometry(160,328,60,19); lib_editor_box->insertItem(tr("No")); lib_editor_box->insertItem(tr("Yes")); - QLabel *lib_editor_label=new QLabel(lib_editor_box, - tr("Allow E&xternal Editing:"),this, - "lib_editor_label"); + QLabel *lib_editor_label= + new QLabel(lib_editor_box,tr("Allow E&xternal Editing:"),this); lib_editor_label->setGeometry(25,328,130,19); lib_editor_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); // // Sample Rate Converter // - lib_converter_box=new QComboBox(this,"lib_converter_box"); + lib_converter_box=new QComboBox(this); lib_converter_box->setGeometry(160,352,sizeHint().width()-170,19); int conv=0; while(src_get_name(conv)!=NULL) { lib_converter_box->insertItem(src_get_name(conv++)); } - QLabel *lib_converter_label=new QLabel(lib_converter_box, - tr("Sample Rate Converter:"),this, - "lib_converter_label"); + QLabel *lib_converter_label= + new QLabel(lib_converter_box,tr("Sample Rate Converter:"),this); lib_converter_label->setGeometry(10,352,145,19); lib_converter_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); @@ -275,7 +261,7 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station, // // Defaults // - QLabel *default_label=new QLabel(tr("Defaults"),this,"default_label"); + QLabel *default_label=new QLabel(tr("Defaults"),this); default_label->setGeometry(25,415,120,19); default_label->setFont(big_font); default_label->setAlignment(AlignRight|ShowPrefix); @@ -283,37 +269,35 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station, // // Default Channels // - lib_channels_box=new QComboBox(this,"lib_channels_box"); + lib_channels_box=new QComboBox(this); lib_channels_box->setGeometry(160,434,60,19); - QLabel *lib_channels_label=new QLabel(lib_channels_box,tr("&Channels:"),this, - "lib_channels_label"); + QLabel *lib_channels_label=new QLabel(lib_channels_box,tr("&Channels:"),this); lib_channels_label->setGeometry(25,434,130,19); lib_channels_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); // // Default Record Mode // - lib_recmode_box=new QComboBox(this,"lib_recmode_box"); + lib_recmode_box=new QComboBox(this); lib_recmode_box->setGeometry(160,456,100,19); - QLabel *lib_recmode_label=new QLabel(lib_recmode_box,tr("Record Mode:"),this, - "lib_recmode_label"); + QLabel *lib_recmode_label=new QLabel(lib_recmode_box,tr("Record Mode:"),this); lib_recmode_label->setGeometry(25,456,130,19); lib_recmode_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); // // Default Trim State // - lib_trimstate_box=new QComboBox(this,"lib_trimstate_box"); + lib_trimstate_box=new QComboBox(this); lib_trimstate_box->setGeometry(160,480,100,19); - QLabel *lib_trimstate_label=new QLabel(lib_trimstate_box,tr("AutoTrim:"), - this,"lib_trimstate_label"); + QLabel *lib_trimstate_label= + new QLabel(lib_trimstate_box,tr("AutoTrim:"),this); lib_trimstate_label->setGeometry(25,480,130,19); lib_trimstate_label->setAlignment(AlignRight|AlignVCenter|ShowPrefix); // // Ok Button // - QPushButton *ok_button=new QPushButton(this,"ok_button"); + QPushButton *ok_button=new QPushButton(this); ok_button->setGeometry(sizeHint().width()-180,sizeHint().height()-60,80,50); ok_button->setDefault(true); ok_button->setFont(small_font); @@ -323,7 +307,7 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station, // // Cancel Button // - QPushButton *cancel_button=new QPushButton(this,"cancel_button"); + QPushButton *cancel_button=new QPushButton(this); cancel_button->setGeometry(sizeHint().width()-90,sizeHint().height()-60, 80,50); cancel_button->setFont(small_font); @@ -361,13 +345,28 @@ EditRDLibrary::EditRDLibrary(RDStation *station,RDStation *cae_station, lib_paranoia_box->insertItem(tr("None")); lib_paranoia_box->setCurrentItem(lib_lib->paranoiaLevel()); lib_riplevel_spin->setValue(lib_lib->ripperLevel()/100); - lib_format_box->insertItem(tr("PCM16")); - lib_format_box->insertItem(tr("MPEG Layer 2")); - lib_format_box->setCurrentItem(lib_lib->defaultFormat()); lib_channels_box->insertItem("1"); lib_channels_box->insertItem("2"); lib_channels_box->setCurrentItem(lib_lib->defaultChannels()-1); - ShowBitRates(lib_lib->defaultFormat(),lib_lib->defaultBitrate()); + lib_format_box->insertItem(tr("PCM16")); + lib_format_box->insertItem(tr("PCM24")); + lib_format_box->insertItem(tr("MPEG Layer 2")); + switch(lib_lib->defaultFormat()) { + case 0: // PCM16 + lib_format_box->setCurrentItem(0); + ShowBitRates(0,lib_lib->defaultBitrate()); + break; + + case 1: // MPEG L2 + lib_format_box->setCurrentItem(2); + ShowBitRates(2,lib_lib->defaultBitrate()); + break; + + case 2: // PCM24 + lib_format_box->setCurrentItem(1); + ShowBitRates(1,lib_lib->defaultBitrate()); + break; + } lib_recmode_box->insertItem(tr("Manual")); lib_recmode_box->insertItem(tr("VOX")); switch(lib_lib->defaultRecordMode()) { @@ -438,10 +437,22 @@ void EditRDLibrary::okData() lib_lib->setRipperDevice(lib_ripdev_edit->text()); lib_lib->setParanoiaLevel(lib_paranoia_box->currentItem()); lib_lib->setRipperLevel(lib_riplevel_spin->value()*100); - lib_lib->setDefaultFormat(lib_format_box->currentItem()); + switch(lib_format_box->currentItem()) { + case 0: // PCM16 + lib_lib->setDefaultFormat(0); + break; + + case 1: // PCM24 + lib_lib->setDefaultFormat(2); + break; + + case 2: // MPEG L2 + lib_lib->setDefaultFormat(1); + break; + } lib_lib->setDefaultChannels(lib_channels_box->currentItem()+1); rate=0; - if(lib_format_box->currentItem()!=0) { + if(lib_format_box->currentItem()==2) { sscanf(lib_bitrate_box->currentText(),"%d",&rate); } lib_lib->setDefaultBitrate(rate*1000); @@ -482,143 +493,145 @@ void EditRDLibrary::ShowBitRates(int layer,int rate) { lib_bitrate_box->clear(); switch(layer) { - case 0: // PCM16 - lib_bitrate_box->setDisabled(true); - break; + case 0: // PCM16 + case 1: // PCM24 + lib_bitrate_box->setDisabled(true); + break; - case 1: // MPEG-1 Layer 2 - lib_bitrate_box->setEnabled(true); - lib_bitrate_box->insertItem(tr("32 kbps/chan")); - lib_bitrate_box->insertItem(tr("48 kbps/chan")); - lib_bitrate_box->insertItem(tr("56 kbps/chan")); - lib_bitrate_box->insertItem(tr("64 kbps/chan")); - lib_bitrate_box->insertItem(tr("80 kbps/chan")); - lib_bitrate_box->insertItem(tr("96 kbps/chan")); - lib_bitrate_box->insertItem(tr("112 kbps/chan")); - lib_bitrate_box->insertItem(tr("128 kbps/chan")); - lib_bitrate_box->insertItem(tr("160 kbps/chan")); - lib_bitrate_box->insertItem(tr("192 kbps/chan")); - switch(lib_lib->defaultBitrate()) { - case 32000: - lib_bitrate_box->setCurrentItem(0); - break; + case 2: // MPEG-1 Layer 2 + lib_bitrate_box->setEnabled(true); + lib_bitrate_box->insertItem(tr("32 kbps/chan")); + lib_bitrate_box->insertItem(tr("48 kbps/chan")); + lib_bitrate_box->insertItem(tr("56 kbps/chan")); + lib_bitrate_box->insertItem(tr("64 kbps/chan")); + lib_bitrate_box->insertItem(tr("80 kbps/chan")); + lib_bitrate_box->insertItem(tr("96 kbps/chan")); + lib_bitrate_box->insertItem(tr("112 kbps/chan")); + lib_bitrate_box->insertItem(tr("128 kbps/chan")); + lib_bitrate_box->insertItem(tr("160 kbps/chan")); + lib_bitrate_box->insertItem(tr("192 kbps/chan")); + switch(lib_lib->defaultBitrate()) { + case 32000: + lib_bitrate_box->setCurrentItem(0); + break; + + case 48000: + lib_bitrate_box->setCurrentItem(1); + break; + + case 56000: + lib_bitrate_box->setCurrentItem(2); + break; + + case 64000: + lib_bitrate_box->setCurrentItem(3); + break; + + case 80000: + lib_bitrate_box->setCurrentItem(4); + break; + + case 96000: + lib_bitrate_box->setCurrentItem(5); + break; - case 48000: - lib_bitrate_box->setCurrentItem(1); - break; + case 112000: + lib_bitrate_box->setCurrentItem(6); + break; - case 56000: - lib_bitrate_box->setCurrentItem(2); - break; + case 128000: + lib_bitrate_box->setCurrentItem(7); + break; - case 64000: - lib_bitrate_box->setCurrentItem(3); - break; + case 160000: + lib_bitrate_box->setCurrentItem(8); + break; - case 80000: - lib_bitrate_box->setCurrentItem(4); - break; + case 192000: + lib_bitrate_box->setCurrentItem(9); + break; - case 96000: - lib_bitrate_box->setCurrentItem(5); - break; + default: + lib_bitrate_box->setCurrentItem(7); // 128 kbps/chan + break; + } + break; - case 112000: - lib_bitrate_box->setCurrentItem(6); - break; + /* + case 2: // MPEG-1 Layer 3 + lib_bitrate_box->setEnabled(true); + lib_bitrate_box->insertItem(tr("32 kbps/chan")); + lib_bitrate_box->insertItem(tr("40 kbps/chan")); + lib_bitrate_box->insertItem(tr("48 kbps/chan")); + lib_bitrate_box->insertItem(tr("56 kbps/chan")); + lib_bitrate_box->insertItem(tr("64 kbps/chan")); + lib_bitrate_box->insertItem(tr("80 kbps/chan")); + lib_bitrate_box->insertItem(tr("96 kbps/chan")); + lib_bitrate_box->insertItem(tr("112 kbps/chan")); + lib_bitrate_box->insertItem(tr("128 kbps/chan")); + lib_bitrate_box->insertItem(tr("160 kbps/chan")); + lib_bitrate_box->insertItem(tr("192 kbps/chan")); + lib_bitrate_box->insertItem(tr("224 kbps/chan")); + lib_bitrate_box->insertItem(tr("256 kbps/chan")); + lib_bitrate_box->insertItem(tr("320 kbps/chan")); + switch(lib_lib->defaultLayer()) { + case 32000: + lib_bitrate_box->setCurrentItem(0); + break; - case 128000: - lib_bitrate_box->setCurrentItem(7); - break; + case 40000: + lib_bitrate_box->setCurrentItem(1); + break; - case 160000: - lib_bitrate_box->setCurrentItem(8); - break; + case 48000: + lib_bitrate_box->setCurrentItem(2); + break; - case 192000: - lib_bitrate_box->setCurrentItem(9); - break; + case 56000: + lib_bitrate_box->setCurrentItem(3); + break; - default: - lib_bitrate_box->setCurrentItem(7); // 128 kbps/chan - break; - } - break; + case 64000: + lib_bitrate_box->setCurrentItem(4); + break; - case 2: // MPEG-1 Layer 3 - lib_bitrate_box->setEnabled(true); - lib_bitrate_box->insertItem(tr("32 kbps/chan")); - lib_bitrate_box->insertItem(tr("40 kbps/chan")); - lib_bitrate_box->insertItem(tr("48 kbps/chan")); - lib_bitrate_box->insertItem(tr("56 kbps/chan")); - lib_bitrate_box->insertItem(tr("64 kbps/chan")); - lib_bitrate_box->insertItem(tr("80 kbps/chan")); - lib_bitrate_box->insertItem(tr("96 kbps/chan")); - lib_bitrate_box->insertItem(tr("112 kbps/chan")); - lib_bitrate_box->insertItem(tr("128 kbps/chan")); - lib_bitrate_box->insertItem(tr("160 kbps/chan")); - lib_bitrate_box->insertItem(tr("192 kbps/chan")); - lib_bitrate_box->insertItem(tr("224 kbps/chan")); - lib_bitrate_box->insertItem(tr("256 kbps/chan")); - lib_bitrate_box->insertItem(tr("320 kbps/chan")); - switch(lib_lib->defaultLayer()) { - case 32000: - lib_bitrate_box->setCurrentItem(0); - break; + case 80000: + lib_bitrate_box->setCurrentItem(5); + break; - case 40000: - lib_bitrate_box->setCurrentItem(1); - break; + case 96000: + lib_bitrate_box->setCurrentItem(6); + break; - case 48000: - lib_bitrate_box->setCurrentItem(2); - break; + case 112000: + lib_bitrate_box->setCurrentItem(7); + break; - case 56000: - lib_bitrate_box->setCurrentItem(3); - break; + case 128000: + lib_bitrate_box->setCurrentItem(8); + break; - case 64000: - lib_bitrate_box->setCurrentItem(4); - break; + case 160000: + lib_bitrate_box->setCurrentItem(9); + break; - case 80000: - lib_bitrate_box->setCurrentItem(5); - break; + case 192000: + lib_bitrate_box->setCurrentItem(10); + break; - case 96000: - lib_bitrate_box->setCurrentItem(6); - break; + case 224000: + lib_bitrate_box->setCurrentItem(11); + break; - case 112000: - lib_bitrate_box->setCurrentItem(7); - break; - - case 128000: - lib_bitrate_box->setCurrentItem(8); - break; - - case 160000: - lib_bitrate_box->setCurrentItem(9); - break; - - case 192000: - lib_bitrate_box->setCurrentItem(10); - break; - - case 224000: - lib_bitrate_box->setCurrentItem(11); - break; - - case 256000: - lib_bitrate_box->setCurrentItem(12); - break; - - case 320000: - lib_bitrate_box->setCurrentItem(13); - break; - } - break; + case 256000: + lib_bitrate_box->setCurrentItem(12); + break; + case 320000: + lib_bitrate_box->setCurrentItem(13); + break; + } + break; + */ } } diff --git a/rdadmin/edit_rdlibrary.h b/rdadmin/edit_rdlibrary.h index 121d851d..d72906d7 100644 --- a/rdadmin/edit_rdlibrary.h +++ b/rdadmin/edit_rdlibrary.h @@ -2,9 +2,7 @@ // // Edit an RDLibrry Configuration // -// (C) Copyright 2002-2003 Fred Gleason -// -// $Id: edit_rdlibrary.h,v 1.19.6.1 2014/01/09 01:03:55 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 @@ -39,8 +37,7 @@ class EditRDLibrary : public QDialog { Q_OBJECT public: - EditRDLibrary(RDStation *station,RDStation *cae_station, - QWidget *parent=0,const char *name=0); + EditRDLibrary(RDStation *station,RDStation *cae_station,QWidget *parent=0); ~EditRDLibrary(); QSize sizeHint() const; QSizePolicy sizePolicy() const; diff --git a/rdadmin/rdadmin_cs.ts b/rdadmin/rdadmin_cs.ts index 25b28d7f..6ec31d03 100644 --- a/rdadmin/rdadmin_cs.ts +++ b/rdadmin/rdadmin_cs.ts @@ -1116,6 +1116,10 @@ nastaveném pro běh služby CAE pro naplnění databáze se zdroji zvuku.Check that the unit is online and try again. + + PCM24 + PCM24 + EditDropbox @@ -2780,19 +2784,19 @@ eingeben um die Audioressourcendatenbank zu füllen. 40 kbps/chan - 40 kB/s/kanál + 40 kB/s/kanál 224 kbps/chan - 224 kB/s/kanál + 224 kB/s/kanál 256 kbps/chan - 256 kB/s/kanál + 256 kB/s/kanál 320 kbps/chan - 320 kB/s/kanál + 320 kB/s/kanál Sample Rate Converter: @@ -2814,6 +2818,10 @@ nastaveném pro běh služby CAE pro naplnění databáze se zdroji zvuku.Previous Předchozí + + PCM24 + PCM24 + EditRDLogedit diff --git a/rdadmin/rdadmin_de.ts b/rdadmin/rdadmin_de.ts index 6b7532b8..c0c391c9 100644 --- a/rdadmin/rdadmin_de.ts +++ b/rdadmin/rdadmin_de.ts @@ -1088,6 +1088,10 @@ configured to run the CAE service in order to populate the audio resources datab Check that the unit is online and try again. + + PCM24 + PCM24 + EditDropbox @@ -2753,19 +2757,19 @@ eingeben um die Audioressourcendatenbank zu füllen. 40 kbps/chan - 48 kbps/Kanals + 48 kbps/Kanals 224 kbps/chan - 64 kbps/Kanal + 64 kbps/Kanal 256 kbps/chan - 256 knps/Kanal + 256 knps/Kanal 320 kbps/chan - 320 kbps/Kanal + 320 kbps/Kanal Sample Rate Converter: @@ -2785,6 +2789,10 @@ configured to run the CAE service in order to populate the audio resources datab Previous Vorherige + + PCM24 + PCM24 + EditRDLogedit diff --git a/rdadmin/rdadmin_es.ts b/rdadmin/rdadmin_es.ts index 9901761a..18ebf97b 100644 --- a/rdadmin/rdadmin_es.ts +++ b/rdadmin/rdadmin_es.ts @@ -1110,6 +1110,10 @@ computador para obtener los recursos de audio de dicho equipo. Check that the unit is online and try again. + + PCM24 + PCM24 + EditDropbox @@ -2748,19 +2752,19 @@ GPIOs 40 kbps/chan - 40 kbps/canal + 40 kbps/canal 224 kbps/chan - 224 kbps/canal + 224 kbps/canal 256 kbps/chan - 256 kbps/canal + 256 kbps/canal 320 kbps/chan - 320 kbps/canal + 320 kbps/canal No @@ -2794,6 +2798,10 @@ equipo configurado para ejecutar CAE para obtener la información de audio.Limit Searches at Startup + + PCM24 + PCM24 + EditRDLogedit diff --git a/rdadmin/rdadmin_fr.ts b/rdadmin/rdadmin_fr.ts index 06ec2d69..52caa85f 100644 --- a/rdadmin/rdadmin_fr.ts +++ b/rdadmin/rdadmin_fr.ts @@ -875,6 +875,10 @@ configured to run the CAE service in order to populate the audio resources datab Check that the unit is online and try again. + + PCM24 + + EditDropbox @@ -2475,22 +2479,6 @@ GPIOs 192 kbps/chan - - 40 kbps/chan - - - - 224 kbps/chan - - - - 256 kbps/chan - - - - 320 kbps/chan - - Sample Rate Converter: @@ -2509,6 +2497,10 @@ configured to run the CAE service in order to populate the audio resources datab Previous + + PCM24 + + EditRDLogedit diff --git a/rdadmin/rdadmin_nb.ts b/rdadmin/rdadmin_nb.ts index 034c6ca9..4a60ca21 100644 --- a/rdadmin/rdadmin_nb.ts +++ b/rdadmin/rdadmin_nb.ts @@ -1070,6 +1070,10 @@ configured to run the CAE service in order to populate the audio resources datab Check that the unit is online and try again. + + PCM24 + PCM24 + EditDropbox @@ -2749,19 +2753,19 @@ for lydressursar. 40 kbps/chan - 40 kbps/kanal + 40 kbps/kanal 224 kbps/chan - 224 kbps/kanal + 224 kbps/kanal 256 kbps/chan - 256 kbps/kanal + 256 kbps/kanal 320 kbps/chan - 320 kbps/kanal + 320 kbps/kanal Sample Rate Converter: @@ -2781,6 +2785,10 @@ configured to run the CAE service in order to populate the audio resources datab Previous Førre + + PCM24 + PCM24 + EditRDLogedit diff --git a/rdadmin/rdadmin_nn.ts b/rdadmin/rdadmin_nn.ts index 034c6ca9..4a60ca21 100644 --- a/rdadmin/rdadmin_nn.ts +++ b/rdadmin/rdadmin_nn.ts @@ -1070,6 +1070,10 @@ configured to run the CAE service in order to populate the audio resources datab Check that the unit is online and try again. + + PCM24 + PCM24 + EditDropbox @@ -2749,19 +2753,19 @@ for lydressursar. 40 kbps/chan - 40 kbps/kanal + 40 kbps/kanal 224 kbps/chan - 224 kbps/kanal + 224 kbps/kanal 256 kbps/chan - 256 kbps/kanal + 256 kbps/kanal 320 kbps/chan - 320 kbps/kanal + 320 kbps/kanal Sample Rate Converter: @@ -2781,6 +2785,10 @@ configured to run the CAE service in order to populate the audio resources datab Previous Førre + + PCM24 + PCM24 + EditRDLogedit diff --git a/rdadmin/rdadmin_pt_BR.ts b/rdadmin/rdadmin_pt_BR.ts index 7db3fbb2..af4aff54 100644 --- a/rdadmin/rdadmin_pt_BR.ts +++ b/rdadmin/rdadmin_pt_BR.ts @@ -1071,6 +1071,10 @@ configured to run the CAE service in order to populate the audio resources datab Check that the unit is online and try again. + + PCM24 + PCM24 + EditDropbox @@ -2741,19 +2745,19 @@ Isto para popular os recursos de áudio na Base de Dados. 40 kbps/chan - 40 kbps/chan + 40 kbps/chan 224 kbps/chan - 224 kbps/chan + 224 kbps/chan 256 kbps/chan - 256 kbps/chan + 256 kbps/chan 320 kbps/chan - 320 kbps/chan + 320 kbps/chan Sample Rate Converter: @@ -2773,6 +2777,10 @@ configured to run the CAE service in order to populate the audio resources datab Previous Anterior + + PCM24 + PCM24 + EditRDLogedit diff --git a/rdcatch/rdcatch.cpp b/rdcatch/rdcatch.cpp index 0ad458f1..43a03928 100644 --- a/rdcatch/rdcatch.cpp +++ b/rdcatch/rdcatch.cpp @@ -2,9 +2,7 @@ // // The Event Schedule Manager for Rivendell. // -// (C) Copyright 2002-2006 Fred Gleason -// -// $Id: rdcatch.cpp,v 1.127.4.8 2014/02/11 23:46:30 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 @@ -1762,219 +1760,237 @@ void MainWidget::RefreshList() l->setText(29,q->value(26).toString()); // Type l->setText(32,QString().sprintf("%u",RDDeck::Idle)); switch((RDRecording::Type)q->value(26).toInt()) { - case RDRecording::Recording: - l->setPixmap(0,*catch_record_map); - l->setText(2,QString().sprintf("%s : %dR", - (const char *)q->value(2).toString(), - q->value(23).toInt())); - switch((RDRecording::StartType)q->value(30).toUInt()) { - case RDRecording::HardStart: - str=QString(tr("Hard")); - l->setText(3,q->value(3).toTime(). - toString(QString().sprintf("%s: hh:mm:ss", - (const char *)str))); - break; + case RDRecording::Recording: + l->setPixmap(0,*catch_record_map); + l->setText(2,QString().sprintf("%s : %dR", + (const char *)q->value(2).toString(), + q->value(23).toInt())); + switch((RDRecording::StartType)q->value(30).toUInt()) { + case RDRecording::HardStart: + str=QString(tr("Hard")); + l->setText(3,q->value(3).toTime(). + toString(QString().sprintf("%s: hh:mm:ss", + (const char *)str))); + break; - case RDRecording::GpiStart: - str=QString(tr("Gpi")); - l->setText(3,QString(). - sprintf("%s: %s,%s,%d:%d,%s", - (const char *)str, - (const char *)q->value(3). - toTime().toString("hh:mm:ss"), - (const char *)q->value(3).toTime(). - addMSecs(q->value(31).toInt()). - toString("hh:mm:ss"), - q->value(32).toInt(), - q->value(33).toInt(), - (const char *)QTime(). - addMSecs(q->value(34).toUInt()). - toString("mm:ss"))); - break; - } - switch((RDRecording::EndType)q->value(35).toUInt()) { - case RDRecording::LengthEnd: - str=QString(tr("Len")); - l->setText(4,QString().sprintf("%s: %s", - (const char *)str, - (const char *) - RDGetTimeLength(q->value(4).toUInt(), - false,false))); - break; + case RDRecording::GpiStart: + str=QString(tr("Gpi")); + l->setText(3,QString(). + sprintf("%s: %s,%s,%d:%d,%s", + (const char *)str, + (const char *)q->value(3). + toTime().toString("hh:mm:ss"), + (const char *)q->value(3).toTime(). + addMSecs(q->value(31).toInt()). + toString("hh:mm:ss"), + q->value(32).toInt(), + q->value(33).toInt(), + (const char *)QTime(). + addMSecs(q->value(34).toUInt()). + toString("mm:ss"))); + break; + } + switch((RDRecording::EndType)q->value(35).toUInt()) { + case RDRecording::LengthEnd: + str=QString(tr("Len")); + l->setText(4,QString().sprintf("%s: %s", + (const char *)str, + (const char *) + RDGetTimeLength(q->value(4).toUInt(), + false,false))); + break; - case RDRecording::HardEnd: - str=QString(tr("Hard")); - l->setText(4,QString().sprintf("%s: %s", - (const char *)str, - (const char *) - q->value(36).toTime(). - toString("hh:mm:ss"))); - break; + case RDRecording::HardEnd: + str=QString(tr("Hard")); + l->setText(4,QString().sprintf("%s: %s", + (const char *)str, + (const char *) + q->value(36).toTime(). + toString("hh:mm:ss"))); + break; - case RDRecording::GpiEnd: - str=QString(tr("Gpi")); - l->setText(4,QString(). - sprintf("%s: %s,%s,%d:%d", - (const char *)str, - (const char *)q->value(36). - toTime().toString("hh:mm:ss"), - (const char *)q->value(36).toTime(). - addMSecs(q->value(37).toInt()). - toString("hh:mm:ss"), - q->value(38).toInt(), - q->value(39).toInt())); - break; - } - str=QString(tr("Cut")); - l->setText(6,QString(). - sprintf("%s %s",(const char *)str, - (const char *)q->value(5).toString())); - sql=QString().sprintf("select SWITCH_STATION,SWITCH_MATRIX\ - from DECKS where \ + case RDRecording::GpiEnd: + str=QString(tr("Gpi")); + l->setText(4,QString(). + sprintf("%s: %s,%s,%d:%d", + (const char *)str, + (const char *)q->value(36). + toTime().toString("hh:mm:ss"), + (const char *)q->value(36).toTime(). + addMSecs(q->value(37).toInt()). + toString("hh:mm:ss"), + q->value(38).toInt(), + q->value(39).toInt())); + break; + } + str=QString(tr("Cut")); + l->setText(6,QString(). + sprintf("%s %s",(const char *)str, + (const char *)q->value(5).toString())); + sql=QString().sprintf("select SWITCH_STATION,SWITCH_MATRIX\ + from DECKS where \ (STATION_NAME=\"%s\")&&(CHANNEL=%d)", - (const char *)q->value(2).toString(), - q->value(23).toInt()); - q1=new RDSqlQuery(sql); - if(q1->first()) { // Source - l->setText(5,GetSourceName(q1->value(0).toString(), - q1->value(1).toInt(), - q->value(13).toInt())); - } - delete q1; - switch((RDSettings::Format)q->value(19).toInt()) { // Format - case RDSettings::Pcm16: - l->setText(20,tr("PCM16")); - break; - case RDSettings::MpegL1: - l->setText(20,tr("MPEG Layer 1")); - break; - case RDSettings::MpegL2: - case RDSettings::MpegL2Wav: - l->setText(20,tr("MPEG Layer 2")); - break; - case RDSettings::MpegL3: - l->setText(20,tr("MPEG Layer 3")); - break; - case RDSettings::Flac: - l->setText(20,tr("FLAC")); - break; - case RDSettings::OggVorbis: - l->setText(20,tr("OggVorbis")); - break; - } - l->setText(21,q->value(20).toString()); // Channels - l->setText(22,q->value(21).toString()); // Sample Rate - l->setText(23,q->value(22).toString()); // Bit Rate - break; + (const char *)q->value(2).toString(), + q->value(23).toInt()); + q1=new RDSqlQuery(sql); + if(q1->first()) { // Source + l->setText(5,GetSourceName(q1->value(0).toString(), + q1->value(1).toInt(), + q->value(13).toInt())); + } + delete q1; + switch((RDSettings::Format)q->value(19).toInt()) { // Format + case RDSettings::Pcm16: + l->setText(20,tr("PCM16")); + break; - case RDRecording::Playout: - l->setPixmap(0,*catch_playout_map); - l->setText(2,QString().sprintf("%s : %dP", - (const char *)q->value(2).toString(), - q->value(23).toInt()-128)); - l->setText(3,q->value(3).toTime().toString("Hard: hh:mm:ss")); - cut=new RDCut(q->value(5).toString()); - str=QString(tr("Len")); - if(cut->exists()) { - l->setText(4,QString().sprintf("%s: %s",(const char *)str, - (const char *)RDGetTimeLength(cut->length(),false,false))); - } - delete cut; - str=QString(tr("Cut")); - l->setText(5,QString(). - sprintf("%s %s",(const char *)str, - (const char *)q->value(5).toString())); - break; + case RDSettings::Pcm24: + l->setText(20,tr("PCM24")); + break; - case RDRecording::MacroEvent: - l->setPixmap(0,*catch_macro_map); - l->setText(2,q->value(2).toString()); - str=QString(tr("Hard")); - l->setText(3,q->value(3).toTime(). - toString(QString(). - sprintf("%s: hh:mm:ss",(const char *)str))); - str=QString(tr("Cart")); - l->setText(5,QString().sprintf("%s %06d",(const char *)str, - q->value(24).toInt())); - break; + case RDSettings::MpegL1: + l->setText(20,tr("MPEG Layer 1")); + break; - case RDRecording::SwitchEvent: - l->setPixmap(0,*catch_switch_map); - l->setText(2,q->value(2).toString()); - str=QString(tr("Hard")); - l->setText(3,q->value(3).toTime(). - toString(QString().sprintf("%s: hh:mm:ss",(const char *)str))); - l->setText(5,GetSourceName(q->value(2).toString(), // Source - q->value(23).toInt(), - q->value(13).toInt())); - l->setText(6,GetDestinationName(q->value(2).toString(), // Dest - q->value(23).toInt(), - q->value(27).toInt())); - break; + case RDSettings::MpegL2: + case RDSettings::MpegL2Wav: + l->setText(20,tr("MPEG Layer 2")); + break; - case RDRecording::Download: - l->setPixmap(0,*catch_download_map); - l->setText(2,q->value(2).toString()); - str=QString(tr("Hard")); - l->setText(3,q->value(3).toTime(). - toString(QString(). - sprintf("%s: hh:mm:ss",(const char *)str))); - str=QString(tr("Cut")); - l->setText(5,q->value(42).toString()); - l->setText(6,QString(). - sprintf("%s %s",(const char *)str, - (const char *)q->value(5).toString())); - break; + case RDSettings::MpegL3: + l->setText(20,tr("MPEG Layer 3")); + break; - case RDRecording::Upload: - l->setPixmap(0,*catch_upload_map); - l->setText(2,q->value(2).toString()); - str=QString(tr("Hard")); - l->setText(3,q->value(3).toTime(). - toString(QString(). - sprintf("%s: hh:mm:ss",(const char *)str))); - str=QString(tr("Cut")); - l->setText(5,QString(). - sprintf("%s %s",(const char *)str, - (const char *)q->value(5).toString())); - l->setText(6,q->value(42).toString()); - switch((RDSettings::Format)q->value(19).toInt()) { // Format - case RDSettings::Pcm16: - l->setText(20,tr("PCM16")); - break; - case RDSettings::MpegL1: - l->setText(20,tr("MPEG Layer 1")); - break; - case RDSettings::MpegL2: - case RDSettings::MpegL2Wav: - l->setText(20,tr("MPEG Layer 2")); - break; - case RDSettings::MpegL3: - l->setText(20,tr("MPEG Layer 3")); - break; - case RDSettings::Flac: - l->setText(20,tr("FLAC")); - break; - case RDSettings::OggVorbis: - l->setText(20,tr("OggVorbis")); - break; - } - if(q->value(44).toString().isEmpty()) { - l->setText(14,tr("[none]")); - } - else { - l->setText(14,q->value(44).toString()); // Feed Key Name - } - l->setText(21,q->value(20).toString()); // Channels - l->setText(22,q->value(21).toString()); // Sample Rate - if(q->value(22).toInt()==0) { // Bit Rate/Quality - l->setText(23,QString().sprintf("Qual %d",q->value(43).toInt())); - } - else { - l->setText(23,QString().sprintf("%d kb/sec", - q->value(22).toInt()/1000)); - } - break; + case RDSettings::Flac: + l->setText(20,tr("FLAC")); + break; + + case RDSettings::OggVorbis: + l->setText(20,tr("OggVorbis")); + break; + } + l->setText(21,q->value(20).toString()); // Channels + l->setText(22,q->value(21).toString()); // Sample Rate + l->setText(23,q->value(22).toString()); // Bit Rate + break; + + case RDRecording::Playout: + l->setPixmap(0,*catch_playout_map); + l->setText(2,QString().sprintf("%s : %dP", + (const char *)q->value(2).toString(), + q->value(23).toInt()-128)); + l->setText(3,q->value(3).toTime().toString("Hard: hh:mm:ss")); + cut=new RDCut(q->value(5).toString()); + str=QString(tr("Len")); + if(cut->exists()) { + l->setText(4,QString().sprintf("%s: %s",(const char *)str, + (const char *)RDGetTimeLength(cut->length(),false,false))); + } + delete cut; + str=QString(tr("Cut")); + l->setText(5,QString(). + sprintf("%s %s",(const char *)str, + (const char *)q->value(5).toString())); + break; + + case RDRecording::MacroEvent: + l->setPixmap(0,*catch_macro_map); + l->setText(2,q->value(2).toString()); + str=QString(tr("Hard")); + l->setText(3,q->value(3).toTime(). + toString(QString(). + sprintf("%s: hh:mm:ss",(const char *)str))); + str=QString(tr("Cart")); + l->setText(5,QString().sprintf("%s %06d",(const char *)str, + q->value(24).toInt())); + break; + + case RDRecording::SwitchEvent: + l->setPixmap(0,*catch_switch_map); + l->setText(2,q->value(2).toString()); + str=QString(tr("Hard")); + l->setText(3,q->value(3).toTime(). + toString(QString().sprintf("%s: hh:mm:ss",(const char *)str))); + l->setText(5,GetSourceName(q->value(2).toString(), // Source + q->value(23).toInt(), + q->value(13).toInt())); + l->setText(6,GetDestinationName(q->value(2).toString(), // Dest + q->value(23).toInt(), + q->value(27).toInt())); + break; + + case RDRecording::Download: + l->setPixmap(0,*catch_download_map); + l->setText(2,q->value(2).toString()); + str=QString(tr("Hard")); + l->setText(3,q->value(3).toTime(). + toString(QString(). + sprintf("%s: hh:mm:ss",(const char *)str))); + str=QString(tr("Cut")); + l->setText(5,q->value(42).toString()); + l->setText(6,QString(). + sprintf("%s %s",(const char *)str, + (const char *)q->value(5).toString())); + break; + + case RDRecording::Upload: + l->setPixmap(0,*catch_upload_map); + l->setText(2,q->value(2).toString()); + str=QString(tr("Hard")); + l->setText(3,q->value(3).toTime(). + toString(QString(). + sprintf("%s: hh:mm:ss",(const char *)str))); + str=QString(tr("Cut")); + l->setText(5,QString(). + sprintf("%s %s",(const char *)str, + (const char *)q->value(5).toString())); + l->setText(6,q->value(42).toString()); + switch((RDSettings::Format)q->value(19).toInt()) { // Format + case RDSettings::Pcm16: + l->setText(20,tr("PCM16")); + break; + + case RDSettings::Pcm24: + l->setText(20,tr("PCM24")); + break; + + case RDSettings::MpegL1: + l->setText(20,tr("MPEG Layer 1")); + break; + + case RDSettings::MpegL2: + case RDSettings::MpegL2Wav: + l->setText(20,tr("MPEG Layer 2")); + break; + + case RDSettings::MpegL3: + l->setText(20,tr("MPEG Layer 3")); + break; + + case RDSettings::Flac: + l->setText(20,tr("FLAC")); + break; + + case RDSettings::OggVorbis: + l->setText(20,tr("OggVorbis")); + break; + } + if(q->value(44).toString().isEmpty()) { + l->setText(14,tr("[none]")); + } + else { + l->setText(14,q->value(44).toString()); // Feed Key Name + } + l->setText(21,q->value(20).toString()); // Channels + l->setText(22,q->value(21).toString()); // Sample Rate + if(q->value(22).toInt()==0) { // Bit Rate/Quality + l->setText(23,QString().sprintf("Qual %d",q->value(43).toInt())); + } + else { + l->setText(23,QString().sprintf("%d kb/sec", + q->value(22).toInt()/1000)); + } + break; } DisplayExitCode(l,(RDRecording::ExitCode)q->value(28).toInt(), q->value(45).toString()); @@ -2209,25 +2225,34 @@ void MainWidget::RefreshLine(RDListViewItem *item) sprintf("Cut %s",(const char *)q->value(5).toString())); item->setPixmap(0,*catch_record_map); switch((RDSettings::Format)q->value(19).toInt()) { // Format - case RDSettings::Pcm16: - item->setText(20,tr("PCM16")); - break; - case RDSettings::MpegL1: - item->setText(20,tr("MPEG Layer 1")); - break; - case RDSettings::MpegL2: - case RDSettings::MpegL2Wav: - item->setText(20,tr("MPEG Layer 2")); - break; - case RDSettings::MpegL3: - item->setText(20,tr("MPEG Layer 3")); - break; - case RDSettings::Flac: - item->setText(20,tr("FLAC")); - break; - case RDSettings::OggVorbis: - item->setText(20,tr("OggVorbis")); - break; + case RDSettings::Pcm16: + item->setText(20,tr("PCM16")); + break; + + case RDSettings::Pcm24: + item->setText(20,tr("PCM24")); + break; + + case RDSettings::MpegL1: + item->setText(20,tr("MPEG Layer 1")); + break; + + case RDSettings::MpegL2: + case RDSettings::MpegL2Wav: + item->setText(20,tr("MPEG Layer 2")); + break; + + case RDSettings::MpegL3: + item->setText(20,tr("MPEG Layer 3")); + break; + + case RDSettings::Flac: + item->setText(20,tr("FLAC")); + break; + + case RDSettings::OggVorbis: + item->setText(20,tr("OggVorbis")); + break; } item->setText(21,q->value(20).toString()); // Channels item->setText(22,q->value(21).toString()); // Sample Rate @@ -2328,25 +2353,34 @@ void MainWidget::RefreshLine(RDListViewItem *item) item->setText(14,q->value(43).toString()); } switch((RDSettings::Format)q->value(19).toInt()) { // Format - case RDSettings::Pcm16: - item->setText(20,tr("PCM16")); - break; - case RDSettings::MpegL1: - item->setText(20,tr("MPEG Layer 1")); - break; - case RDSettings::MpegL2: - case RDSettings::MpegL2Wav: - item->setText(20,tr("MPEG Layer 2")); - break; - case RDSettings::MpegL3: - item->setText(20,tr("MPEG Layer 3")); - break; - case RDSettings::Flac: - item->setText(20,tr("FLAC")); - break; - case RDSettings::OggVorbis: - item->setText(20,tr("OggVorbis")); - break; + case RDSettings::Pcm16: + item->setText(20,tr("PCM16")); + break; + + case RDSettings::Pcm24: + item->setText(20,tr("PCM24")); + break; + + case RDSettings::MpegL1: + item->setText(20,tr("MPEG Layer 1")); + break; + + case RDSettings::MpegL2: + case RDSettings::MpegL2Wav: + item->setText(20,tr("MPEG Layer 2")); + break; + + case RDSettings::MpegL3: + item->setText(20,tr("MPEG Layer 3")); + break; + + case RDSettings::Flac: + item->setText(20,tr("FLAC")); + break; + + case RDSettings::OggVorbis: + item->setText(20,tr("OggVorbis")); + break; } item->setText(21,q->value(20).toString()); // Channels item->setText(22,q->value(21).toString()); // Sample Rate diff --git a/rdcatch/rdcatch_cs.ts b/rdcatch/rdcatch_cs.ts index 00d3bf53..91d2d53e 100644 --- a/rdcatch/rdcatch_cs.ts +++ b/rdcatch/rdcatch_cs.ts @@ -1319,5 +1319,9 @@ nové User + + PCM24 + PCM24 + diff --git a/rdcatch/rdcatch_de.ts b/rdcatch/rdcatch_de.ts index d967d417..a82f0aab 100644 --- a/rdcatch/rdcatch_de.ts +++ b/rdcatch/rdcatch_de.ts @@ -1319,5 +1319,9 @@ Neu User + + PCM24 + PCM24 + diff --git a/rdcatch/rdcatch_es.ts b/rdcatch/rdcatch_es.ts index fc7e92f9..bf830b9c 100644 --- a/rdcatch/rdcatch_es.ts +++ b/rdcatch/rdcatch_es.ts @@ -1263,5 +1263,9 @@ como Nuevo User + + PCM24 + + diff --git a/rdcatch/rdcatch_fr.ts b/rdcatch/rdcatch_fr.ts index 9c8932dd..2df9b3d2 100644 --- a/rdcatch/rdcatch_fr.ts +++ b/rdcatch/rdcatch_fr.ts @@ -1253,5 +1253,9 @@ New User + + PCM24 + + diff --git a/rdcatch/rdcatch_nb.ts b/rdcatch/rdcatch_nb.ts index 708103d5..8d3f1b66 100644 --- a/rdcatch/rdcatch_nb.ts +++ b/rdcatch/rdcatch_nb.ts @@ -1316,5 +1316,9 @@ ny User + + PCM24 + PCM24 + diff --git a/rdcatch/rdcatch_nn.ts b/rdcatch/rdcatch_nn.ts index 708103d5..8d3f1b66 100644 --- a/rdcatch/rdcatch_nn.ts +++ b/rdcatch/rdcatch_nn.ts @@ -1316,5 +1316,9 @@ ny User + + PCM24 + PCM24 + diff --git a/rdcatch/rdcatch_pt_BR.ts b/rdcatch/rdcatch_pt_BR.ts index 71839468..a0e2ea1a 100644 --- a/rdcatch/rdcatch_pt_BR.ts +++ b/rdcatch/rdcatch_pt_BR.ts @@ -1319,5 +1319,9 @@ Novo User + + PCM24 + PCM24 + diff --git a/rdcatchd/batch.cpp b/rdcatchd/batch.cpp index cfb60cc3..b61277c0 100644 --- a/rdcatchd/batch.cpp +++ b/rdcatchd/batch.cpp @@ -2,9 +2,7 @@ // // Batch Routines for the Rivendell netcatcher daemon // -// (C) Copyright 2002-2007, 2010 Fred Gleason -// -// $Id: batch.cpp,v 1.6.2.1 2012/05/10 16:00:53 cvs Exp $ +// (C) Copyright 2002-2015, 2010 Fred Gleason // // 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 @@ -480,6 +478,10 @@ bool MainObject::Import(CatchEvent *evt) settings->setFormat(RDSettings::Pcm16); break; + case RDCae::Pcm24: + settings->setFormat(RDSettings::Pcm24); + break; + case RDCae::MpegL1: case RDCae::MpegL2: case RDCae::MpegL3: diff --git a/rdcatchd/rdcatchd.cpp b/rdcatchd/rdcatchd.cpp index 72698a4b..c8c3bdea 100644 --- a/rdcatchd/rdcatchd.cpp +++ b/rdcatchd/rdcatchd.cpp @@ -2,9 +2,7 @@ // // The Rivendell Netcatcher Daemon // -// (C) Copyright 2002-2007 Fred Gleason -// -// $Id: rdcatchd.cpp,v 1.142.4.2.2.1 2014/06/03 18:23:38 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 @@ -1263,7 +1261,7 @@ bool MainObject::StartRecording(int event) catch_events[event]. setTempName(GetTempRecordingName(catch_events[event].id())); catch_events[event].setDeleteTempFile(true); - format=RDCae::Pcm16; + format=RDCae::Pcm24; } // @@ -1888,17 +1886,56 @@ void MainObject::LoadEngine(bool adv_day) QString MainObject::LoadEventSql() { - return QString("select ID,IS_ACTIVE,TYPE,CHANNEL,CUT_NAME,\ - SUN,MON,TUE,WED,THU,FRI,SAT,START_TIME,LENGTH,\ - START_GPI,END_GPI,TRIM_THRESHOLD,STARTDATE_OFFSET,\ - ENDDATE_OFFSET,FORMAT,CHANNELS,SAMPRATE,BITRATE,\ - MACRO_CART,SWITCH_INPUT,SWITCH_OUTPUT,ONE_SHOT,\ - START_TYPE,START_LENGTH,START_MATRIX,START_LINE,\ - START_OFFSET,END_TYPE,END_TIME,END_LENGTH,\ - END_MATRIX,END_LINE,URL,URL_USERNAME,URL_PASSWORD,\ - QUALITY,NORMALIZE_LEVEL,ALLOW_MULT_RECS,\ - MAX_GPI_REC_LENGTH,DESCRIPTION,FEED_ID,\ - EVENTDATE_OFFSET,ENABLE_METADATA from RECORDINGS"); + return QString("select ")+ + "ID,"+ // 00 + "IS_ACTIVE,"+ // 01 + "TYPE,"+ // 02 + "CHANNEL,"+ // 03 + "CUT_NAME,"+ // 04 + "SUN,"+ // 05 + "MON,"+ // 06 + "TUE,"+ // 07 + "WED,"+ // 08 + "THU,"+ // 09 + "FRI,"+ // 10 + "SAT,"+ // 11 + "START_TIME,"+ // 12 + "LENGTH,"+ // 13 + "START_GPI,"+ // 14 + "END_GPI,"+ // 15 + "TRIM_THRESHOLD,"+ // 16 + "STARTDATE_OFFSET,"+ // 17 + "ENDDATE_OFFSET,"+ // 18 + "FORMAT," // 19 + "CHANNELS,"+ // 20 + "SAMPRATE,"+ // 21 + "BITRATE,"+ // 22 + "MACRO_CART,"+ // 23 + "SWITCH_INPUT,"+ // 24 + "SWITCH_OUTPUT,"+ // 25 + "ONE_SHOT,"+ // 26 + "START_TYPE,"+ // 27 + "START_LENGTH,"+ // 28 + "START_MATRIX,"+ // 29 + "START_LINE,"+ // 30 + "START_OFFSET,"+ // 31 + "END_TYPE,"+ // 32 + "END_TIME,"+ // 33 + "END_LENGTH,"+ // 34 + "END_MATRIX,"+ // 35 + "END_LINE,"+ // 36 + "URL,"+ // 37 + "URL_USERNAME,"+ // 38 + "URL_PASSWORD,"+ // 39 + "QUALITY,"+ // 40 + "NORMALIZE_LEVEL,"+ // 41 + "ALLOW_MULT_RECS,"+ // 42 + "MAX_GPI_REC_LENGTH,"+ // 43 + "DESCRIPTION,"+ // 44 + "FEED_ID,"+ // 45 + "EVENTDATE_OFFSET,"+ // 46 + "ENABLE_METADATA "+ // 47 + "from RECORDINGS"; } @@ -1923,7 +1960,26 @@ void MainObject::LoadEvent(RDSqlQuery *q,CatchEvent *e,bool add) e->setTrimThreshold(q->value(16).toUInt()); e->setStartdateOffset(q->value(17).toUInt()); e->setEnddateOffset(q->value(18).toUInt()); - e->setFormat((RDCae::AudioCoding)q->value(19).toInt()); + switch((RDSettings::Format)q->value(19).toInt()) { + case RDSettings::Pcm16: + e->setFormat(RDCae::Pcm16); + break; + + case RDSettings::Pcm24: + e->setFormat(RDCae::Pcm24); + break; + + case RDSettings::MpegL2: + case RDSettings::MpegL2Wav: + e->setFormat(RDCae::MpegL2); + break; + + case RDSettings::MpegL1: + case RDSettings::MpegL3: + case RDSettings::Flac: + case RDSettings::OggVorbis: + break; + } e->setChannels(q->value(20).toInt()); e->setSampleRate(catch_system->sampleRate()); //e->setSampleRate(q->value(21).toInt()); diff --git a/rdhpi/rdhpiplaystream.cpp b/rdhpi/rdhpiplaystream.cpp index 7dedf877..dab05899 100644 --- a/rdhpi/rdhpiplaystream.cpp +++ b/rdhpi/rdhpiplaystream.cpp @@ -196,6 +196,13 @@ bool RDHPIPlayStream::formatSupported(RDWaveFile::Format format) state=HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format); break; + case RDWaveFile::Pcm24: + LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), + HPI_FORMAT_PCM24_SIGNED, + getSamplesPerSec(),getHeadBitRate(),0)); + state=HPI_OutStreamQueryFormat(NULL,hostream,&hpi_format); + break; + case RDWaveFile::MpegL1: LogHpi(HPI_FormatCreate(&hpi_format,getChannels(), HPI_FORMAT_MPEG_L1, @@ -244,6 +251,10 @@ bool RDHPIPlayStream::formatSupported() return formatSupported(RDWaveFile::Pcm16); break; + case 24: + return formatSupported(RDWaveFile::Pcm24); + break; + default: return false; } @@ -421,6 +432,11 @@ bool RDHPIPlayStream::play() HPI_FORMAT_PCM16_SIGNED, getSamplesPerSec(),0,0)); break; + case 24: + LogHpi(HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_PCM24_SIGNED, + getSamplesPerSec(),0,0)); + break; case 32: LogHpi(HPI_FormatCreate(&format,getChannels(), HPI_FORMAT_PCM32_SIGNED, diff --git a/rdhpi/rdhpirecordstream.cpp b/rdhpi/rdhpirecordstream.cpp index 7c9a459b..c703ed21 100644 --- a/rdhpi/rdhpirecordstream.cpp +++ b/rdhpi/rdhpirecordstream.cpp @@ -2,9 +2,7 @@ // // A class for recording Microsoft WAV files. // -// (C) Copyright 2002-2007 Fred Gleason -// -// $Id: rdhpirecordstream.cpp,v 1.7 2011/05/19 22:16:54 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 @@ -219,6 +217,13 @@ bool RDHPIRecordStream::formatSupported(RDWaveFile::Format format) state=HPI_InStreamQueryFormat(NULL,histream,&hformat); break; + case RDWaveFile::Pcm24: + LogHpi(HPI_FormatCreate(&hformat,getChannels(), + HPI_FORMAT_PCM24_SIGNED, + getSamplesPerSec(),getHeadBitRate(),0)); + state=HPI_InStreamQueryFormat(NULL,histream,&hformat); + break; + case RDWaveFile::MpegL1: LogHpi(HPI_FormatCreate(&hformat,getChannels(),HPI_FORMAT_MPEG_L1, getSamplesPerSec(),getHeadBitRate(),0)); @@ -264,6 +269,10 @@ bool RDHPIRecordStream::formatSupported() return formatSupported(RDWaveFile::Pcm16); break; + case 24: + return formatSupported(RDWaveFile::Pcm24); + break; + default: return false; } @@ -399,98 +408,110 @@ bool RDHPIRecordStream::recordReady() return false; } switch(getFormatTag()) { - case WAVE_FORMAT_PCM: - if(debug) { - printf("RDHPIRecordStream: using PCM%d format\n", - getBitsPerSample()); - } - switch(getBitsPerSample()) { - case 8: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM8_UNSIGNED,getSamplesPerSec(), - 0,0); - break; - case 16: - hpi_error=HPI_FormatCreate(&format,getChannels(), + case WAVE_FORMAT_PCM: + if(debug) { + printf("RDHPIRecordStream: using PCM%d format\n", + getBitsPerSample()); + } + switch(getBitsPerSample()) { + case 8: + hpi_error=HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_PCM8_UNSIGNED,getSamplesPerSec(), + 0,0); + break; + + case 16: + hpi_error=HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_PCM16_SIGNED,getSamplesPerSec(), + 0,0); + break; + + case 24: + hpi_error=HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_PCM24_SIGNED,getSamplesPerSec(), + 0,0); + break; + + case 32: + hpi_error=HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_PCM32_SIGNED,getSamplesPerSec(), + 0,0); + break; + + default: + if(debug) { + printf("RDHPIRecordStream: unsupported sample size\n"); + } + return false; + } + break; + + case WAVE_FORMAT_MPEG: + if(debug) { + printf("RDHPIRecordStream: using MPEG-1 Layer %d\n",getHeadLayer()); + } + switch(getHeadLayer()) { + case 1: + hpi_error=HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_MPEG_L1,getSamplesPerSec(), + getHeadBitRate(),getHeadFlags()); + break; + + case 2: + hpi_error=HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_MPEG_L2,getSamplesPerSec(), + getHeadBitRate(),getHeadFlags()); + break; + + case 3: + hpi_error=HPI_FormatCreate(&format,getChannels(), + HPI_FORMAT_MPEG_L3,getSamplesPerSec(), + getHeadBitRate(),getHeadFlags()); + break; + + default: + hpi_error=HPI_AdapterClose(NULL,card_index[card_number]); + if(debug) { + printf("RDHPIRecordStream: invalid MPEG-1 layer\n"); + } + return false; + } + if(getMextChunk()) { + setMextHomogenous(true); + setMextPaddingUsed(false); + setMextHackedBitRate(true); + setMextFreeFormat(false); + setMextFrameSize(144*getHeadBitRate()/getSamplesPerSec()); + setMextAncillaryLength(5); + setMextLeftEnergyPresent(true); + if(getChannels()>1) { + setMextRightEnergyPresent(true); + } + else { + setMextRightEnergyPresent(false); + } + setMextPrivateDataPresent(false); + } + break; + + case WAVE_FORMAT_VORBIS: + if(debug) { + printf("RDHPIRecordStream: using OggVorbis\n"); + } + hpi_error=HPI_FormatCreate(&format,getChannels(), HPI_FORMAT_PCM16_SIGNED,getSamplesPerSec(), 0,0); - break; - case 32: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM32_SIGNED,getSamplesPerSec(), - 0,0); - break; - default: - if(debug) { - printf("RDHPIRecordStream: unsupported sample size\n"); - } - return false; - } - break; + break; - case WAVE_FORMAT_MPEG: - if(debug) { - printf("RDHPIRecordStream: using MPEG-1 Layer %d\n",getHeadLayer()); - } - switch(getHeadLayer()) { - case 1: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_MPEG_L1,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags()); - break; - case 2: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_MPEG_L2,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags()); - break; - case 3: - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_MPEG_L3,getSamplesPerSec(), - getHeadBitRate(),getHeadFlags()); - break; - default: - hpi_error=HPI_AdapterClose(NULL,card_index[card_number]); - if(debug) { - printf("RDHPIRecordStream: invalid MPEG-1 layer\n"); - } - return false; - } - if(getMextChunk()) { - setMextHomogenous(true); - setMextPaddingUsed(false); - setMextHackedBitRate(true); - setMextFreeFormat(false); - setMextFrameSize(144*getHeadBitRate()/getSamplesPerSec()); - setMextAncillaryLength(5); - setMextLeftEnergyPresent(true); - if(getChannels()>1) { - setMextRightEnergyPresent(true); - } - else { - setMextRightEnergyPresent(false); - } - setMextPrivateDataPresent(false); - } - break; - - case WAVE_FORMAT_VORBIS: - if(debug) { - printf("RDHPIRecordStream: using OggVorbis\n"); - } - hpi_error=HPI_FormatCreate(&format,getChannels(), - HPI_FORMAT_PCM16_SIGNED,getSamplesPerSec(), - 0,0); - break; - - default: - if(debug) { - printf("RDHPIRecordStream: invalid format tag\n"); - } - return false; - break; + default: + if(debug) { + printf("RDHPIRecordStream: invalid format tag\n"); + } + return false; + break; } if((hpi_error=HPI_InStreamQueryFormat(NULL,hpi_stream, - &format))!=0) { + &format))!=0) { if(debug) { HPI_GetErrorText(hpi_error,hpi_text); printf("Num: %d\n",hpi_error); diff --git a/rdhpi/rdhpirecordstream.h b/rdhpi/rdhpirecordstream.h index b53a9e19..6dfe7cd1 100644 --- a/rdhpi/rdhpirecordstream.h +++ b/rdhpi/rdhpirecordstream.h @@ -2,9 +2,7 @@ // // A class for recording Microsoft WAV files. // -// (C) Copyright 2002-2007 Fred Gleason -// -// $Id: rdhpirecordstream.h,v 1.6.6.1 2012/05/04 14:56:22 cvs Exp $ +// (C) Copyright 2002-2015 Fred Gleason // // 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 diff --git a/rdlibrary/record_cut.cpp b/rdlibrary/record_cut.cpp index 30ef30d7..a3e867a1 100644 --- a/rdlibrary/record_cut.cpp +++ b/rdlibrary/record_cut.cpp @@ -730,6 +730,11 @@ void RecordCut::recordData() rec_format=RDCae::MpegL2; break; + case 2: + rec_cut->setCodingFormat(2); + rec_format=RDCae::Pcm24; + break; + default: rec_cut->setCodingFormat(0); rec_format=RDCae::Pcm16; diff --git a/tests/Makefile.am b/tests/Makefile.am index 4ac151e9..17ea6e69 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -33,6 +33,7 @@ moc_%.cpp: %.h noinst_PROGRAMS = audio_convert_test\ audio_export_test\ audio_import_test\ + audio_peaks_test\ datedecode_test\ reserve_carts_test\ sas_switch_torture\ @@ -51,6 +52,9 @@ audio_export_test_LDADD = @LIB_RDLIBS@ @LIBVORBIS@ dist_audio_import_test_SOURCES = audio_import_test.cpp audio_import_test.h audio_import_test_LDADD = @LIB_RDLIBS@ @LIBVORBIS@ +dist_audio_peaks_test_SOURCES = audio_peaks_test.cpp audio_peaks_test.h +audio_peaks_test_LDADD = @LIB_RDLIBS@ @LIBVORBIS@ + dist_datedecode_test_SOURCES = datedecode_test.cpp datedecode_test.h datedecode_test_LDADD = @LIB_RDLIBS@ @LIBVORBIS@ diff --git a/tests/audio_convert_test.cpp b/tests/audio_convert_test.cpp index a353ea48..72d68a0a 100644 --- a/tests/audio_convert_test.cpp +++ b/tests/audio_convert_test.cpp @@ -2,9 +2,7 @@ // // Test the Rivendell file format converter. // -// (C) Copyright 2010 Fred Gleason -// -// $Id: audio_convert_test.cpp,v 1.3 2011/06/21 22:20:44 cvs Exp $ +// (C) Copyright 2010-2015 Fred Gleason // // 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 @@ -79,6 +77,7 @@ MainObject::MainObject(QObject *parent,const char *name) } switch(format) { case RDSettings::Pcm16: + case RDSettings::Pcm24: case RDSettings::MpegL2: case RDSettings::MpegL2Wav: case RDSettings::MpegL3: diff --git a/tests/audio_convert_test.h b/tests/audio_convert_test.h index 6352ea9f..5f2ace57 100644 --- a/tests/audio_convert_test.h +++ b/tests/audio_convert_test.h @@ -2,9 +2,7 @@ // // Test the Rivendell file format converter. // -// (C) Copyright 2010 Fred Gleason -// -// $Id: audio_convert_test.h,v 1.2 2010/07/29 19:32:38 cvs Exp $ +// (C) Copyright 2010-2015 Fred Gleason // // 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 @@ -32,7 +30,7 @@ #include #include -#define AUDIO_CONVERT_TEST_USAGE "[options]\n\nTest the Rivendell audio converter routines\n\nOptions are:\n--source-file=\n\n--destination-file=\n\n--start-point=\n\n--end-point=\n\n--destination-format=\n Supported formats are:\n 0 - PCM16 WAV\n 2 - MPEG Layer 2\n 3 - MPEG Layer 3\n 4 - FLAC\n 5 - OggVorbis\n 6 - MPEG Layer 2 WAV\n\n--destination-channels=\n\n--destination-sample-rate=\n\n--destination-bit-rate=\n\n--destination-quality=\n\n--normalization-level=\n\n--speed-ratio=\n\n" +#define AUDIO_CONVERT_TEST_USAGE "[options]\n\nTest the Rivendell audio converter routines\n\nOptions are:\n--source-file=\n\n--destination-file=\n\n--start-point=\n\n--end-point=\n\n--destination-format=\n Supported formats are:\n 0 - PCM16 WAV\n 2 - MPEG Layer 2\n 3 - MPEG Layer 3\n 4 - FLAC\n 5 - OggVorbis\n 6 - MPEG Layer 2 WAV\n 7 - PCM24 WAV\n\n--destination-channels=\n\n--destination-sample-rate=\n\n--destination-bit-rate=\n\n--destination-quality=\n\n--normalization-level=\n\n--speed-ratio=\n\n" // // Global Variables diff --git a/tests/audio_peaks_test.cpp b/tests/audio_peaks_test.cpp new file mode 100644 index 00000000..ed1199a2 --- /dev/null +++ b/tests/audio_peaks_test.cpp @@ -0,0 +1,85 @@ +// audio_peaks_test.cpp +// +// Test the Rivendell audio peak routines. +// +// (C) Copyright 2015 Fred Gleason +// +// 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 +#include + +#include +#include + +#include +#include + +#include "audio_peaks_test.h" + +MainObject::MainObject(QObject *parent) + :QObject(parent) +{ + QString filename; + + // + // Read Command Options + // + RDCmdSwitch *cmd= + new RDCmdSwitch(qApp->argc(),qApp->argv(),"audio_peaks_test", + AUDIO_PEAKS_TEST_USAGE); + for(unsigned i=0;ikeys();i++) { + if(cmd->key(i)=="--filename") { + filename=cmd->value(i); + cmd->setProcessed(i,true); + } + if(!cmd->processed(i)) { + fprintf(stderr,"audio_peaks_test: unknown option \"%s\"\n", + (const char *)cmd->value(i)); + exit(256); + } + } + if(filename.isEmpty()) { + fprintf(stderr,"audio_peaks_test: you must specify --filename\n"); + exit(256); + } + + RDWaveFile *wave=new RDWaveFile(); + wave->nameWave(filename); + if(!wave->openWave()) { + fprintf(stderr,"audio_peaks_test: unable to open \"%s\"\n", + (const char *)filename); + exit(256); + } + if(wave->hasEnergy()) { + printf("\"%s\" has energy, size: %u\n",(const char *)filename, + wave->energySize()); + } + else { + printf("\"%s\" does NOT have energy\n",(const char *)filename); + } + wave->closeWave(); + delete wave; + + exit(0); +} + + +int main(int argc,char *argv[]) +{ + QApplication a(argc,argv,false); + new MainObject(NULL); + return a.exec(); +} diff --git a/tests/audio_peaks_test.h b/tests/audio_peaks_test.h new file mode 100644 index 00000000..089a13aa --- /dev/null +++ b/tests/audio_peaks_test.h @@ -0,0 +1,35 @@ +// audio_peaks_test.h +// +// Test the Rivendell audio peak routines. +// +// (C) Copyright 2015 Fred Gleason +// +// 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. +// + +#ifndef AUDIO_PEAKS_TEST_H +#define AUDIO_PEAKS_TEST_H + +#include + +#define AUDIO_PEAKS_TEST_USAGE "[options]\n\nTest the Rivendell audio peak routines\n\nOptions are:\n--filename=\n\n" + +class MainObject : public QObject +{ + public: + MainObject(QObject *parent=0); +}; + + +#endif // AUDIO_PEAKS_TEST_H diff --git a/web/rdxport/import.cpp b/web/rdxport/import.cpp index 4841629c..1a69f014 100644 --- a/web/rdxport/import.cpp +++ b/web/rdxport/import.cpp @@ -107,6 +107,10 @@ void Xport::Import() case 1: settings->setFormat(RDSettings::MpegL2Wav); break; + + case 2: + settings->setFormat(RDSettings::Pcm24); + break; } settings->setChannels(channels); settings->setSampleRate(xport_system->sampleRate());