diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2016-09-29 02:12:25 +0300 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2016-09-29 02:12:25 +0300 |
commit | fa1541bc5eb0339e0752bda6afd67f6669e32232 (patch) | |
tree | ff15cc9a4e50ba9f6936f3c004e3421e6aaa6c25 /src | |
parent | f07bf8ddf63db17ec1b968aeb0ccc4286c02eea2 (diff) | |
download | atracdenc-fa1541bc5eb0339e0752bda6afd67f6669e32232.tar.gz |
Checking of input file format added
Diffstat (limited to 'src')
-rw-r--r-- | src/main.cpp | 83 | ||||
-rw-r--r-- | src/wav.cpp | 7 | ||||
-rw-r--r-- | src/wav.h | 1 |
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; +} @@ -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; |