diff options
author | Max Kellermann <max@duempel.org> | 2013-04-09 01:24:52 +0200 |
---|---|---|
committer | Max Kellermann <max@duempel.org> | 2013-04-09 01:24:52 +0200 |
commit | c654c7630aad220a4935c34b076e107b6b0561a5 (patch) | |
tree | 7ca6e4e30bee7153ed54f302467140180d77490d /src/dsd2pcm/main.cpp | |
parent | 3f3b26fb0ee090bfc1321572904aa94deca42a84 (diff) | |
download | mpd-c654c7630aad220a4935c34b076e107b6b0561a5.tar.gz mpd-c654c7630aad220a4935c34b076e107b6b0561a5.tar.xz mpd-c654c7630aad220a4935c34b076e107b6b0561a5.zip |
pcm_*: move to src/pcm/
Diffstat (limited to 'src/dsd2pcm/main.cpp')
-rw-r--r-- | src/dsd2pcm/main.cpp | 120 |
1 files changed, 0 insertions, 120 deletions
diff --git a/src/dsd2pcm/main.cpp b/src/dsd2pcm/main.cpp deleted file mode 100644 index 0b58888a8..000000000 --- a/src/dsd2pcm/main.cpp +++ /dev/null @@ -1,120 +0,0 @@ -#include <iostream> -#include <vector> -#include <cstring> - -#include "dsd2pcm.hpp" -#include "noiseshape.hpp" - -namespace { - -const float my_ns_coeffs[] = { -// b1 b2 a1 a2 - -1.62666423, 0.79410094, 0.61367127, 0.23311013, // section 1 - -1.44870017, 0.54196219, 0.03373857, 0.70316556 // section 2 -}; - -const int my_ns_soscount = sizeof(my_ns_coeffs)/(sizeof(my_ns_coeffs[0])*4); - -inline long myround(float x) -{ - return static_cast<long>(x + (x>=0 ? 0.5f : -0.5f)); -} - -template<typename T> -struct id { typedef T type; }; - -template<typename T> -inline T clip( - typename id<T>::type min, - T v, - typename id<T>::type max) -{ - if (v<min) return min; - if (v>max) return max; - return v; -} - -inline void write_intel16(unsigned char * ptr, unsigned word) -{ - ptr[0] = word & 0xFF; - ptr[1] = (word >> 8) & 0xFF; -} - -inline void write_intel24(unsigned char * ptr, unsigned long word) -{ - ptr[0] = word & 0xFF; - ptr[1] = (word >> 8) & 0xFF; - ptr[2] = (word >> 16) & 0xFF; -} - -} // anonymous namespace - -using std::vector; -using std::cin; -using std::cout; -using std::cerr; - -int main(int argc, char *argv[]) -{ - const int block = 16384; - int channels = -1; - int lsbitfirst = -1; - int bits = -1; - if (argc==4) { - if ('1'<=argv[1][0] && argv[1][0]<='9') channels = 1 + (argv[1][0]-'1'); - if (argv[2][0]=='m' || argv[2][0]=='M') lsbitfirst=0; - if (argv[2][0]=='l' || argv[2][0]=='L') lsbitfirst=1; - if (!strcmp(argv[3],"16")) bits = 16; - if (!strcmp(argv[3],"24")) bits = 24; - } - if (channels<1 || lsbitfirst<0 || bits<0) { - cerr << "\n" - "DSD2PCM filter (raw DSD64 --> 352 kHz raw PCM)\n" - "(c) 2009 Sebastian Gesemann\n\n" - "(filter as in \"reads data from stdin and writes to stdout\")\n\n" - "Syntax: dsd2pcm <channels> <bitorder> <bitdepth>\n" - "channels = 1,2,3,...,9 (number of channels in DSD stream)\n" - "bitorder = L (lsb first), M (msb first) (DSD stream option)\n" - "bitdepth = 16 or 24 (intel byte order, output option)\n\n" - "Note: At 16 bits/sample a noise shaper kicks in that can preserve\n" - "a dynamic range of 135 dB below 30 kHz.\n\n"; - return 1; - } - int bytespersample = bits/8; - vector<dxd> dxds (channels); - vector<noise_shaper> ns; - if (bits==16) { - ns.resize(channels, noise_shaper(my_ns_soscount, my_ns_coeffs) ); - } - vector<unsigned char> dsd_data (block * channels); - vector<float> float_data (block); - vector<unsigned char> pcm_data (block * channels * bytespersample); - char * const dsd_in = reinterpret_cast<char*>(&dsd_data[0]); - char * const pcm_out = reinterpret_cast<char*>(&pcm_data[0]); - while (cin.read(dsd_in,block * channels)) { - for (int c=0; c<channels; ++c) { - dxds[c].translate(block,&dsd_data[0]+c,channels, - lsbitfirst, - &float_data[0],1); - unsigned char * out = &pcm_data[0] + c*bytespersample; - if (bits==16) { - for (int s=0; s<block; ++s) { - float r = float_data[s]*32768 + ns[c].get(); - long smp = clip(-32768,myround(r),32767); - ns[c].update( clip(-1,smp-r,1) ); - write_intel16(out,smp); - out += channels*bytespersample; - } - } else { - for (int s=0; s<block; ++s) { - float r = float_data[s]*8388608; - long smp = clip(-8388608,myround(r),8388607); - write_intel24(out,smp); - out += channels*bytespersample; - } - } - } - cout.write(pcm_out,block*channels*bytespersample); - } -} - |