Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/core/StarIODeviceCallbacks.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/core/StarIODeviceCallbacks.cpp')
-rw-r--r--source/core/StarIODeviceCallbacks.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/source/core/StarIODeviceCallbacks.cpp b/source/core/StarIODeviceCallbacks.cpp
new file mode 100644
index 0000000..ca8b692
--- /dev/null
+++ b/source/core/StarIODeviceCallbacks.cpp
@@ -0,0 +1,39 @@
+#include "StarIODeviceCallbacks.hpp"
+#include "vorbis/vorbisfile.h"
+
+namespace Star {
+
+IODeviceCallbacks::IODeviceCallbacks(IODevicePtr device)
+ : m_device(std::move(device)) {
+ if (!m_device->isOpen())
+ m_device->open(IOMode::Read);
+}
+
+IODevicePtr const& IODeviceCallbacks::device() const {
+ return m_device;
+}
+
+size_t IODeviceCallbacks::readFunc(void* ptr, size_t size, size_t nmemb, void* datasource) {
+ auto* callbacks = static_cast<IODeviceCallbacks*>(datasource);
+ return callbacks->m_device->read((char*)ptr, size * nmemb) / size;
+}
+
+int IODeviceCallbacks::seekFunc(void* datasource, ogg_int64_t offset, int whence) {
+ auto* callbacks = static_cast<IODeviceCallbacks*>(datasource);
+ callbacks->m_device->seek(offset, (IOSeek)whence);
+ return 0;
+}
+
+long int IODeviceCallbacks::tellFunc(void* datasource) {
+ auto* callbacks = static_cast<IODeviceCallbacks*>(datasource);
+ return (long int)callbacks->m_device->pos();
+}
+
+void IODeviceCallbacks::setupOggCallbacks(ov_callbacks& callbacks) {
+ callbacks.read_func = readFunc;
+ callbacks.seek_func = seekFunc;
+ callbacks.tell_func = tellFunc;
+ callbacks.close_func = nullptr;
+}
+
+} \ No newline at end of file