aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDaniil Cherednik <dan.cherednik@gmail.com>2016-09-29 02:12:25 +0300
committerDaniil Cherednik <dan.cherednik@gmail.com>2016-09-29 02:12:25 +0300
commitfa1541bc5eb0339e0752bda6afd67f6669e32232 (patch)
treeff15cc9a4e50ba9f6936f3c004e3421e6aaa6c25 /src
parentf07bf8ddf63db17ec1b968aeb0ccc4286c02eea2 (diff)
downloadatracdenc-fa1541bc5eb0339e0752bda6afd67f6669e32232.tar.gz
Checking of input file format added
Diffstat (limited to 'src')
-rw-r--r--src/main.cpp83
-rw-r--r--src/wav.cpp7
-rw-r--r--src/wav.h1
3 files changed, 61 insertions, 30 deletions
diff --git a/src/main.cpp b/src/main.cpp
index f39c8d0..f9688bd 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -1,5 +1,6 @@
#include <iostream>
#include <string>
+#include <stdexcept>
#include <getopt.h>
@@ -84,6 +85,15 @@ enum EOptions
O_GAINCONTROL = 6,
};
+static void CheckInputFormat(const TWav* p)
+{
+ if (p->IsFormatSupported() == false)
+ throw std::runtime_error("unsupported format of input file");
+
+ if (p->GetSampleRate() != 44100)
+ throw std::runtime_error("unsupported sample rate");
+}
+
static void PrepareAtrac1Encoder(const string& inFile,
const string& outFile,
const bool noStdOut,
@@ -95,7 +105,11 @@ static void PrepareAtrac1Encoder(const string& inFile,
{
using NAtrac1::TAtrac1Data;
- wavIO->reset(new TWav(inFile));
+ {
+ TWav* wavPtr = new TWav(inFile);
+ CheckInputFormat(wavPtr);
+ wavIO->reset(wavPtr);
+ }
const int numChannels = (*wavIO)->GetChannelNum();
*totalSamples = (*wavIO)->GetTotalSamples();
//TODO: recheck it
@@ -148,7 +162,11 @@ static void PrepareAtrac3Encoder(const string& inFile,
std::cout << "WARNING: ATRAC3 is uncompleted, result will be not good )))" << std::endl;
if (!noStdOut)
std::cout << "bitrate " << encoderSettings.ConteinerParams->Bitrate << std::endl;
- wavIO->reset(new TWav(inFile));
+ {
+ TWav* wavPtr = new TWav(inFile);
+ CheckInputFormat(wavPtr);
+ wavIO->reset(wavPtr);
+ }
const int numChannels = (*wavIO)->GetChannelNum();
*totalSamples = (*wavIO)->GetTotalSamples();
TCompressedIOPtr omaIO = TCompressedIOPtr(new TOma(outFile,
@@ -274,38 +292,43 @@ int main(int argc, char* const* argv)
uint64_t totalSamples = 0;
TWavPtr wavIO;
uint32_t pcmFrameSz = 0; //size of one pcm frame to process
- switch (mode) {
- case E_ENCODE:
- {
- using NAtrac1::TAtrac1Data;
- NAtrac1::TAtrac1EncodeSettings encoderSettings(bfuIdxConst, fastBfuNumSearch, windowMode, winMask);
- PrepareAtrac1Encoder(inFile, outFile, noStdOut, std::move(encoderSettings),
+
+ try {
+ switch (mode) {
+ case E_ENCODE:
+ {
+ using NAtrac1::TAtrac1Data;
+ NAtrac1::TAtrac1EncodeSettings encoderSettings(bfuIdxConst, fastBfuNumSearch, windowMode, winMask);
+ PrepareAtrac1Encoder(inFile, outFile, noStdOut, std::move(encoderSettings),
&totalSamples, &wavIO, &pcmEngine, &atracProcessor);
- pcmFrameSz = TAtrac1Data::NumSamples;
- }
- break;
- case E_DECODE:
- {
- using NAtrac1::TAtrac1Data;
- PrepareAtrac1Decoder(inFile, outFile, noStdOut,
+ pcmFrameSz = TAtrac1Data::NumSamples;
+ }
+ break;
+ case E_DECODE:
+ {
+ using NAtrac1::TAtrac1Data;
+ PrepareAtrac1Decoder(inFile, outFile, noStdOut,
&totalSamples, &wavIO, &pcmEngine, &atracProcessor);
- pcmFrameSz = TAtrac1Data::NumSamples;
- }
- break;
- case (E_ENCODE | E_ATRAC3):
- {
- using NAtrac3::TAtrac3Data;
- NAtrac3::TAtrac3EncoderSettings encoderSettings(bitrate * 1024, noGainControl, noTonalComponents);
- PrepareAtrac3Encoder(inFile, outFile, noStdOut, std::move(encoderSettings),
+ pcmFrameSz = TAtrac1Data::NumSamples;
+ }
+ break;
+ case (E_ENCODE | E_ATRAC3):
+ {
+ using NAtrac3::TAtrac3Data;
+ NAtrac3::TAtrac3EncoderSettings encoderSettings(bitrate * 1024, noGainControl, noTonalComponents);
+ PrepareAtrac3Encoder(inFile, outFile, noStdOut, std::move(encoderSettings),
&totalSamples, &wavIO, &pcmEngine, &atracProcessor);
- pcmFrameSz = TAtrac3Data::NumSamples;;
- }
- break;
- default:
- {
- cerr << "Processing mode was not specified" << endl;
- return 1;
+ pcmFrameSz = TAtrac3Data::NumSamples;;
+ }
+ break;
+ default:
+ {
+ throw std::runtime_error("Processing mode was not specified");
+ }
}
+ } catch (const std::exception& ex) {
+ cerr << "Fatal error: " << ex.what() << endl;
+ return 1;
}
auto atracLambda = (mode == E_DECODE) ? atracProcessor->GetDecodeLambda() :
diff --git a/src/wav.cpp b/src/wav.cpp
index b7757f6..212a513 100644
--- a/src/wav.cpp
+++ b/src/wav.cpp
@@ -40,15 +40,22 @@ TWav::TWav(const std::string& filename, int channels, int sampleRate)
//disable scaling short -> [-1.0, 1.0]
File.command(SFC_SET_NORM_DOUBLE /*| SFC_SET_NORM_FLOAT*/, nullptr, SF_FALSE);
}
+
TWav::~TWav() {
}
uint64_t TWav::GetTotalSamples() const {
return File.frames();
}
+
uint32_t TWav::GetChannelNum() const {
return File.channels();
}
+
uint32_t TWav::GetSampleRate() const {
return File.samplerate();
}
+
+bool TWav::IsFormatSupported() const {
+ return (File.format() & SF_FORMAT_TYPEMASK) == SF_FORMAT_WAV;
+}
diff --git a/src/wav.h b/src/wav.h
index afad5b5..6814a5e 100644
--- a/src/wav.h
+++ b/src/wav.h
@@ -65,6 +65,7 @@ public:
uint32_t GetChannelNum() const;
uint32_t GetSampleRate() const;
uint64_t GetTotalSamples() const;
+ bool IsFormatSupported() const;
template<class T>
IPCMReader<T>* GetPCMReader() const;