summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/flac.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/util/flac.cpp')
-rw-r--r--src/lib/util/flac.cpp34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/lib/util/flac.cpp b/src/lib/util/flac.cpp
index 3b76bb14303..d3110ca0d38 100644
--- a/src/lib/util/flac.cpp
+++ b/src/lib/util/flac.cpp
@@ -85,6 +85,8 @@ bool flac_encoder::reset()
FLAC__stream_encoder_set_blocksize(m_encoder, m_block_size);
// re-start processing
+ if (m_file)
+ return (FLAC__stream_encoder_init_stream(m_encoder, write_callback_static, seek_callback_static, tell_callback_static, nullptr, this) == FLAC__STREAM_ENCODER_INIT_STATUS_OK);
return (FLAC__stream_encoder_init_stream(m_encoder, write_callback_static, nullptr, nullptr, nullptr, this) == FLAC__STREAM_ENCODER_INIT_STATUS_OK);
}
@@ -281,6 +283,38 @@ FLAC__StreamEncoderWriteStatus flac_encoder::write_callback(const FLAC__byte buf
return FLAC__STREAM_ENCODER_WRITE_STATUS_OK;
}
+FLAC__StreamEncoderSeekStatus flac_encoder::seek_callback_static(const FLAC__StreamEncoder *encoder, FLAC__uint64 absolute_byte_offset, void *client_data)
+{
+ return reinterpret_cast<flac_encoder *>(client_data)->seek_callback(absolute_byte_offset);
+}
+
+FLAC__StreamEncoderSeekStatus flac_encoder::seek_callback(FLAC__uint64 absolute_byte_offset)
+{
+ if (m_file)
+ {
+ if (!m_file->seek(absolute_byte_offset, SEEK_SET))
+ return FLAC__STREAM_ENCODER_SEEK_STATUS_OK;
+ return FLAC__STREAM_ENCODER_SEEK_STATUS_ERROR;
+ }
+ return FLAC__STREAM_ENCODER_SEEK_STATUS_UNSUPPORTED;
+}
+
+FLAC__StreamEncoderTellStatus flac_encoder::tell_callback_static(const FLAC__StreamEncoder *encoder, FLAC__uint64 *absolute_byte_offset, void *client_data)
+{
+ return reinterpret_cast<flac_encoder *>(client_data)->tell_callback(absolute_byte_offset);
+}
+
+FLAC__StreamEncoderTellStatus flac_encoder::tell_callback(FLAC__uint64 *absolute_byte_offset)
+{
+ if (m_file)
+ {
+ if (!m_file->tell(*absolute_byte_offset))
+ return FLAC__STREAM_ENCODER_TELL_STATUS_OK;
+ return FLAC__STREAM_ENCODER_TELL_STATUS_ERROR;
+ }
+ return FLAC__STREAM_ENCODER_TELL_STATUS_UNSUPPORTED;
+}
+
//**************************************************************************