4 * ***** BEGIN GPL LICENSE BLOCK *****
6 * Copyright 2009-2011 Jörg Hermann Müller
8 * This file is part of AudaSpace.
10 * Audaspace is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * AudaSpace is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with Audaspace; if not, write to the Free Software Foundation,
22 * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 * ***** END GPL LICENSE BLOCK *****
27 /** \file audaspace/sndfile/AUD_SndFileReader.cpp
32 #include "AUD_SndFileReader.h"
36 sf_count_t AUD_SndFileReader::vio_get_filelen(void *user_data)
38 AUD_SndFileReader* reader = (AUD_SndFileReader*)user_data;
39 return reader->m_membuffer->getSize();
42 sf_count_t AUD_SndFileReader::vio_seek(sf_count_t offset, int whence,
45 AUD_SndFileReader* reader = (AUD_SndFileReader*)user_data;
50 reader->m_memoffset = offset;
53 reader->m_memoffset = reader->m_memoffset + offset;
56 reader->m_memoffset = reader->m_membuffer->getSize() + offset;
60 return reader->m_memoffset;
63 sf_count_t AUD_SndFileReader::vio_read(void *ptr, sf_count_t count,
66 AUD_SndFileReader* reader = (AUD_SndFileReader*)user_data;
68 if(reader->m_memoffset + count > reader->m_membuffer->getSize())
69 count = reader->m_membuffer->getSize() - reader->m_memoffset;
71 memcpy(ptr, ((data_t*)reader->m_membuffer->getBuffer()) +
72 reader->m_memoffset, count);
73 reader->m_memoffset += count;
78 sf_count_t AUD_SndFileReader::vio_tell(void *user_data)
80 AUD_SndFileReader* reader = (AUD_SndFileReader*)user_data;
82 return reader->m_memoffset;
85 static const char* fileopen_error = "AUD_SndFileReader: File couldn't be "
88 AUD_SndFileReader::AUD_SndFileReader(std::string filename) :
94 m_sndfile = sf_open(filename.c_str(), SFM_READ, &sfinfo);
97 AUD_THROW(AUD_ERROR_FILE, fileopen_error);
99 m_specs.channels = (AUD_Channels) sfinfo.channels;
100 m_specs.rate = (AUD_SampleRate) sfinfo.samplerate;
101 m_length = sfinfo.frames;
102 m_seekable = sfinfo.seekable;
105 AUD_SndFileReader::AUD_SndFileReader(AUD_Reference<AUD_Buffer> buffer) :
110 m_vio.get_filelen = vio_get_filelen;
111 m_vio.read = vio_read;
112 m_vio.seek = vio_seek;
113 m_vio.tell = vio_tell;
119 m_sndfile = sf_open_virtual(&m_vio, SFM_READ, &sfinfo, this);
122 AUD_THROW(AUD_ERROR_FILE, fileopen_error);
124 m_specs.channels = (AUD_Channels) sfinfo.channels;
125 m_specs.rate = (AUD_SampleRate) sfinfo.samplerate;
126 m_length = sfinfo.frames;
127 m_seekable = sfinfo.seekable;
130 AUD_SndFileReader::~AUD_SndFileReader()
135 bool AUD_SndFileReader::isSeekable() const
140 void AUD_SndFileReader::seek(int position)
144 position = sf_seek(m_sndfile, position, SEEK_SET);
145 m_position = position;
149 int AUD_SndFileReader::getLength() const
154 int AUD_SndFileReader::getPosition() const
159 AUD_Specs AUD_SndFileReader::getSpecs() const
164 void AUD_SndFileReader::read(int& length, bool& eos, sample_t* buffer)
168 length = sf_readf_float(m_sndfile, buffer, length);
170 m_position += length;