File indexing completed on 2024-05-12 04:06:03

0001 /*
0002     SPDX-FileCopyrightText: 2019 Alexander Potashev <aspotashev@gmail.com>
0003 
0004     SPDX-License-Identifier: LGPL-2.0-only
0005 */
0006 
0007 #include "virtualfileqt-openal.h"
0008 
0009 VirtualFileQt::VirtualFileQt(const QString &path)
0010     : m_file(path)
0011 {
0012 }
0013 
0014 bool VirtualFileQt::open()
0015 {
0016     return m_file.open(QIODevice::ReadOnly);
0017 }
0018 
0019 int64_t VirtualFileQt::getFileLen() const
0020 {
0021     return static_cast<int64_t>(m_file.size());
0022 }
0023 
0024 int64_t VirtualFileQt::seek(int64_t offset, int whence)
0025 {
0026     switch (whence) {
0027     case SEEK_SET:
0028         return m_file.seek(static_cast<quint64>(offset)) ? m_file.pos() : -1;
0029     case SEEK_CUR:
0030         return m_file.seek(m_file.pos() + static_cast<quint64>(offset)) ? m_file.pos() : -1;
0031     case SEEK_END:
0032         return m_file.seek(m_file.size() + static_cast<quint64>(offset)) ? m_file.pos() : -1;
0033     default:
0034         return -1;
0035     }
0036 }
0037 
0038 int64_t VirtualFileQt::read(void *ptr, int64_t count)
0039 {
0040     return static_cast<int64_t>(m_file.read(static_cast<char *>(ptr), static_cast<qint64>(count)));
0041 }
0042 
0043 int64_t VirtualFileQt::write(const void *, int64_t)
0044 {
0045     // Writing is not supported.
0046     return 0;
0047 }
0048 
0049 int64_t VirtualFileQt::tell()
0050 {
0051     return static_cast<int64_t>(m_file.pos());
0052 }
0053 
0054 sf_count_t sf_get_filelen(void *user_data)
0055 {
0056     return static_cast<sf_count_t>(VirtualFileQt::get(user_data)->getFileLen());
0057 }
0058 
0059 sf_count_t sf_seek(sf_count_t offset, int whence, void *user_data)
0060 {
0061     return static_cast<sf_count_t>(VirtualFileQt::get(user_data)->seek(static_cast<int64_t>(offset), whence));
0062 }
0063 
0064 sf_count_t sf_read(void *ptr, sf_count_t count, void *user_data)
0065 {
0066     return static_cast<sf_count_t>(VirtualFileQt::get(user_data)->read(ptr, static_cast<int64_t>(count)));
0067 }
0068 
0069 sf_count_t sf_write(const void *ptr, sf_count_t count, void *user_data)
0070 {
0071     return static_cast<sf_count_t>(VirtualFileQt::get(user_data)->write(ptr, static_cast<int64_t>(count)));
0072 }
0073 
0074 sf_count_t sf_tell(void *user_data)
0075 {
0076     return static_cast<sf_count_t>(VirtualFileQt::get(user_data)->tell());
0077 }
0078 
0079 SF_VIRTUAL_IO sfVirtualIO = {
0080     sf_get_filelen,
0081     sf_seek,
0082     sf_read,
0083     sf_write,
0084     sf_tell,
0085 };
0086 
0087 SF_VIRTUAL_IO &VirtualFileQt::getSndfileVirtualIO()
0088 {
0089     return sfVirtualIO;
0090 }
0091 
0092 VirtualFileQt *VirtualFileQt::get(void *user_data)
0093 {
0094     return static_cast<VirtualFileQt *>(user_data);
0095 }