23 #include <QApplication> 26 #include <QVarLengthArray> 28 #include <KLocalizedString> 31 #include <vorbis/vorbisenc.h> 48 m_vorbis_comment_map(), m_dst(Q_NULLPTR)
73 const FLAC__byte buffer[],
size_t bytes,
77 if (!
m_dst)
return FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
79 qint64 written =
m_dst->write(
80 reinterpret_cast<const char *>(&(buffer[0])),
81 static_cast<qint64>(bytes)
84 return (written == static_cast<qint64>(bytes)) ?
85 FLAC__STREAM_ENCODER_WRITE_STATUS_OK :
86 FLAC__STREAM_ENCODER_WRITE_STATUS_FATAL_ERROR;
99 m_vc = FLAC__metadata_object_new(FLAC__METADATA_TYPE_VORBIS_COMMENT);
113 const QString &value)
119 s = tag +
_(
"=") + value;
122 QByteArray val = s.toUtf8();
125 FLAC__StreamMetadata_VorbisComment_Entry entry;
126 entry.length = val.length();
127 entry.entry =
reinterpret_cast<FLAC__byte *
>(val.data());
130 unsigned int count =
m_vc->data.vorbis_comment.num_comments;
131 bool ok = FLAC__metadata_object_vorbiscomment_insert_comment(
132 m_vc, count, entry,
true);
146 QVector<FLAC__StreamMetadata *> &flac_metadata)
149 VorbisCommentMap::ConstIterator it;
155 if (!info.
contains(it.value()))
continue;
157 QString value = info.
get(it.value()).toString();
158 vc.
add(it.key(), value);
160 flac_metadata.append(vc.
data());
174 qDebug(
"FlacEncoder::encode()");
179 int tracks = info.
tracks();
180 unsigned int bits = info.
bits();
183 set_compression_level(5);
184 set_channels(static_cast<unsigned>(tracks));
185 set_bits_per_sample(static_cast<unsigned>(bits));
186 set_sample_rate(static_cast<unsigned>(info.
rate()));
187 set_total_samples_estimate(static_cast<FLAC__uint64>(length));
191 set_do_mid_side_stereo(tracks == 2);
192 set_loose_mid_side_stereo(tracks == 2);
195 QVector<FLAC__StreamMetadata *> flac_metadata;
199 unsigned int meta_count = flac_metadata.size();
202 if (!set_metadata(flac_metadata.data(), meta_count)) {
203 qWarning(
"FlacEncoder: setting meta data failed !?");
207 QVector<FLAC__int32 *> flac_buffer;
210 if (!dst.open(QIODevice::ReadWrite | QIODevice::Truncate)) {
212 i18n(
"Unable to open the file for saving."));
218 FLAC__StreamEncoderInitStatus init_state = init();
219 if (init_state != FLAC__STREAM_ENCODER_INIT_STATUS_OK) {
220 qWarning(
"state = %d", static_cast<int>(init_state));
222 i18n(
"Unable to open the FLAC encoder."));
229 for (
int track=0; track < tracks; track++)
231 FLAC__int32 *buffer =
232 static_cast<FLAC__int32 *
>(malloc(
sizeof(FLAC__int32) * len));
235 flac_buffer.append(buffer);
240 Q_ASSERT(in_buffer.
size() == len);
241 Q_ASSERT(flac_buffer.size() == tracks);
243 if ((in_buffer.
size() < len) || (flac_buffer.size() < tracks))
252 if (shift < 0) shift = 0;
253 FLAC__int32 div = (1 << shift);
254 if (div == 1) div = 0;
255 const FLAC__int32 clip_min = -(1 << bits);
256 const FLAC__int32 clip_max = (1 << bits) - 1;
259 while (rest && len && !src.
isCanceled() && result) {
262 if (!in_buffer.
resize(len)) {
269 for (
int track = 0; track < tracks; track++) {
274 (*reader) >> in_buffer;
275 unsigned int l = in_buffer.
size();
277 if (!in_buffer.resize(len)) {
282 while (l < len) in_buffer[l++] = 0;
285 FLAC__int32 *buf = flac_buffer.at(track);
290 for (
unsigned int in_pos = 0; in_pos < len; in_pos++) {
291 FLAC__int32 s = in[in_pos];
293 if (s > clip_max) s = clip_max;
294 if (s < clip_min) s = clip_min;
302 FLAC__int32 **buffer = flac_buffer.
data();
303 bool processed = process(buffer, static_cast<unsigned>(len));
318 while (!flac_metadata.isEmpty()) {
319 FLAC__StreamMetadata *m = flac_metadata[0];
320 if (m) FLAC__metadata_object_delete(m);
321 flac_metadata.remove(0);
327 while (!flac_buffer.isEmpty()) {
328 FLAC__int32 *buf = flac_buffer.first();
330 flac_buffer.remove(0);
bool contains(const FileProperty property) const
virtual void metadata_callback(const ::FLAC__StreamMetadata *metadata) Q_DECL_OVERRIDE
virtual bool encode(QWidget *widget, Kwave::MultiTrackReader &src, QIODevice &dst, const Kwave::MetaDataList &meta_data) Q_DECL_OVERRIDE
QVariant get(FileProperty key) const
virtual Kwave::Encoder * instance() Q_DECL_OVERRIDE
virtual void encodeMetaData(const Kwave::FileInfo &info, QVector< FLAC__StreamMetadata *> &flac_metadata)
Kwave::VorbisCommentMap m_vorbis_comment_map
static int error(QWidget *widget, QString message, QString caption=QString())
sample_index_t length() const
#define REGISTER_MIME_TYPES
unsigned int tracks() const
virtual QList< Kwave::FileProperty > supportedProperties() Q_DECL_OVERRIDE
virtual unsigned int blockSize() const
#define REGISTER_COMPRESSION_TYPES
unsigned int size() const
unsigned int bits() const
virtual ~FlacEncoder() Q_DECL_OVERRIDE
virtual ::FLAC__StreamEncoderWriteStatus write_callback(const FLAC__byte buffer[], size_t bytes, unsigned samples, unsigned current_frame) Q_DECL_OVERRIDE
bool resize(unsigned int size) Q_REQUIRED_RESULT