2 #include <vorbis/vorbisfile.h>
15 #include <QApplication>
31 int written = fwrite(page->header, 1, page->header_len, fp);
32 written += fwrite(page->body, 1, page->body_len, fp);
39 Encoder(outfile, qualitylevel, metadata),
45 vorbis_comment_init(&
vc);
47 vorbis_info_init(&
vi);
50 if (qualitylevel == 0)
52 if (qualitylevel == 1)
55 int ret = vorbis_encode_setup_vbr(&
vi, 2, 44100, quality);
58 LOG(VB_GENERAL, LOG_ERR, QString(
"Error initializing VORBIS encoder."
59 " Got return code: %1").arg(ret));
60 vorbis_info_clear(&
vi);
64 vorbis_encode_ctl(&
vi, OV_ECTL_RATEMANAGE_SET, NULL);
65 vorbis_encode_setup_init(&
vi);
66 vorbis_analysis_init(&
vd, &
vi);
67 vorbis_block_init(&
vd, &
vb);
71 ogg_packet header_main;
72 ogg_packet header_comments;
73 ogg_packet header_codebooks;
75 vorbis_analysis_headerout(&
vd, &
vc, &header_main, &header_comments,
78 ogg_stream_packetin(&
os, &header_main);
79 ogg_stream_packetin(&
os, &header_comments);
80 ogg_stream_packetin(&
os, &header_codebooks);
83 while ((result = ogg_stream_flush(&
os, &
og)))
85 if (!result || !
m_out)
88 if (ret !=
og.header_len +
og.body_len)
90 LOG(VB_GENERAL, LOG_ERR,
91 "Failed to write header to output stream.");
99 ogg_stream_clear(&
os);
100 vorbis_block_clear(&
vb);
101 vorbis_dsp_clear(&
vd);
102 vorbis_comment_clear(&
vc);
103 vorbis_info_clear(&
vi);
118 long realsamples = 0;
119 signed char *chars = (
signed char *)bytes;
121 realsamples = length / 4;
126 float**
buffer = vorbis_analysis_buffer(&
vd, realsamples);
128 for (i = 0; i < realsamples; i++)
130 buffer[0][i] = ((chars[i * 4 + 1] << 8) |
131 (chars[i * 4] & 0xff)) / 32768.0f;
132 buffer[1][i] = ((chars[i * 4 + 3] << 8) |
133 (chars[i * 4 + 2] & 0xff)) / 32768.0f;
136 vorbis_analysis_wrote(&
vd, realsamples);
138 while (vorbis_analysis_blockout(&
vd, &
vb) == 1)
140 vorbis_analysis(&
vb, NULL);
141 vorbis_bitrate_addblock(&
vb);
143 while (vorbis_bitrate_flushpacket(&
vd, &
op))
145 ogg_stream_packetin(&
os, &
op);
151 int result = ogg_stream_pageout(&
os, &
og);
156 if (ret !=
og.header_len +
og.body_len)
158 LOG(VB_GENERAL, LOG_ERR,
159 QString(
"Failed to write ogg data. Aborting."));
164 if (ogg_page_eos(&
og))