1 #include "output-drv.hpp"
9 std::string
expand_options(const std::string
& opts
)
12 std::ostringstream ret
;
13 for(size_t i
= 0; i
< opts
.length(); i
++) {
29 class output_driver_oggenc
: public output_driver
32 output_driver_oggenc(const std::string
& _filename
, const std::string
& _options
)
36 set_audio_callback
<output_driver_oggenc
>(*this, &output_driver_oggenc::audio_callback
);
39 ~output_driver_oggenc()
46 const audio_settings
& a
= get_audio_settings();
48 std::stringstream commandline
;
49 commandline
<< "oggenc -r -R " << a
.get_rate() << " ";
50 commandline
<< expand_options(options
);
51 commandline
<< "-o " << filename
<< " -";
52 std::string s
= commandline
.str();
53 out
= popen(s
.c_str(), "w");
55 std::stringstream str
;
56 str
<< "Can't run oggenc (" << s
<< ")";
57 throw std::runtime_error(str
.str());
61 void audio_callback(short left
, short right
)
64 rawdata
[1] = ((unsigned short)left
>> 8) & 0xFF;
65 rawdata
[0] = ((unsigned short)left
) & 0xFF;
66 rawdata
[3] = ((unsigned short)right
>> 8) & 0xFF;
67 rawdata
[2] = ((unsigned short)right
) & 0xFF;
68 if(fwrite(rawdata
, 1, 4, out
) < 4)
69 throw std::runtime_error("Error writing sample to oggenc");
77 class output_driver_oggenc_factory
: output_driver_factory
80 output_driver_oggenc_factory()
81 : output_driver_factory("oggenc")
85 output_driver
& make(const std::string
& type
, const std::string
& name
, const std::string
& parameters
)
87 return *new output_driver_oggenc(name
, parameters
);