diff options
Diffstat (limited to 'source/core/StarIODeviceCallbacks.cpp')
-rw-r--r-- | source/core/StarIODeviceCallbacks.cpp | 39 |
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 |