Allow size-specific resizers
[jpcrr.git] / streamtools / output-drv-rawaudio.cpp
blob5dab318fda69c9f4e18eca02e870ac1f67be3fbb
1 #include "output-drv.hpp"
2 #include <cstdio>
3 #include <stdexcept>
4 #include <string>
6 namespace
8 class output_driver_rawaudio : public output_driver
10 public:
11 output_driver_rawaudio(const std::string& filename)
13 if(filename != "-")
14 out = fopen(filename.c_str(), "wb");
15 else
16 out = stdout;
17 if(!out)
18 throw std::runtime_error("Unable to open output file");
19 set_audio_callback<output_driver_rawaudio>(*this, &output_driver_rawaudio::audio_callback);
22 ~output_driver_rawaudio()
24 fclose(out);
27 void ready()
31 void audio_callback(short left, short right)
33 uint8_t rawdata[4];
34 rawdata[1] = ((unsigned short)left >> 8) & 0xFF;
35 rawdata[0] = ((unsigned short)left) & 0xFF;
36 rawdata[3] = ((unsigned short)right >> 8) & 0xFF;
37 rawdata[2] = ((unsigned short)right) & 0xFF;
38 if(fwrite(rawdata, 1, 4, out) < 4)
39 throw std::runtime_error("Error writing sample to file");
41 private:
42 FILE* out;
45 class output_driver_rawaudio_factory : output_driver_factory
47 public:
48 output_driver_rawaudio_factory()
49 : output_driver_factory("rawaudio")
53 output_driver& make(const std::string& type, const std::string& name, const std::string& parameters)
55 if(parameters != "")
56 throw std::runtime_error("rawaudio output does not take parameters");
57 return *new output_driver_rawaudio(name);
59 } factory;