1 #include "output-drv.hpp"
9 class output_driver_oggenc
: public output_driver
12 output_driver_oggenc(const std::string
& _filename
, const std::string
& _options
)
16 set_audio_callback
<output_driver_oggenc
>(*this, &output_driver_oggenc::audio_callback
);
19 ~output_driver_oggenc()
26 const audio_settings
& a
= get_audio_settings();
28 std::stringstream commandline
;
29 commandline
<< "oggenc -r -R " << a
.get_rate() << " ";
30 commandline
<< expand_arguments_common(options
, "--", "=");
31 commandline
<< "-o " << filename
<< " -";
32 std::string s
= commandline
.str();
33 out
= popen(s
.c_str(), "w");
35 std::stringstream str
;
36 str
<< "Can't run oggenc (" << s
<< ")";
37 throw std::runtime_error(str
.str());
41 void audio_callback(short left
, short right
)
44 rawdata
[1] = ((unsigned short)left
>> 8) & 0xFF;
45 rawdata
[0] = ((unsigned short)left
) & 0xFF;
46 rawdata
[3] = ((unsigned short)right
>> 8) & 0xFF;
47 rawdata
[2] = ((unsigned short)right
) & 0xFF;
48 if(fwrite(rawdata
, 1, 4, out
) < 4)
49 throw std::runtime_error("Error writing sample to oggenc");
57 class output_driver_oggenc_factory
: output_driver_factory
60 output_driver_oggenc_factory()
61 : output_driver_factory("oggenc")
65 output_driver
& make(const std::string
& type
, const std::string
& name
, const std::string
& parameters
)
67 return *new output_driver_oggenc(name
, parameters
);