kwave  18.07.70
Kwave::VirtualAudioFile Class Reference

#include <VirtualAudioFile.h>

Inheritance diagram for Kwave::VirtualAudioFile:
Inheritance graph
Collaboration diagram for Kwave::VirtualAudioFile:
Collaboration graph

Public Member Functions

 VirtualAudioFile (QIODevice &device)
 
virtual ~VirtualAudioFile ()
 
virtual void open (Kwave::VirtualAudioFile *x, AFfilesetup setup)
 
virtual void close ()
 
AFfilehandle & handle ()
 
AFvirtualfile * file ()
 
long int lastError ()
 
QString lastErrorText ()
 
virtual qint64 read (char *data, unsigned int nbytes)
 
virtual qint64 length ()
 
virtual qint64 write (const char *data, unsigned int nbytes)
 
virtual void destroy ()
 
virtual qint64 seek (qint64 offset, bool is_relative)
 
virtual qint64 tell ()
 

Static Public Member Functions

static Kwave::VirtualAudioFileadapter (AFvirtualfile *vfile)
 

Private Attributes

QIODevice & m_device
 
AFfilehandle m_file_handle
 
AFvirtualfile * m_virtual_file
 
long int m_last_error
 
QString m_last_error_text
 

Detailed Description

This class builds an interface between a QIODevice and a virtual file in libaudiofile.

Definition at line 40 of file VirtualAudioFile.h.

Constructor & Destructor Documentation

◆ VirtualAudioFile()

Kwave::VirtualAudioFile::VirtualAudioFile ( QIODevice &  device)
explicit

Constructor

Parameters
deviceQIODevice used as source/destination

Definition at line 136 of file VirtualAudioFile.cpp.

References __af_virtual_file_new(), af_file_destroy(), af_file_length(), af_file_read(), af_file_seek(), af_file_tell(), af_file_write(), and m_virtual_file.

137  :m_device(device), m_file_handle(Q_NULLPTR), m_virtual_file(Q_NULLPTR),
139 {
140  // create the virtual file structure for libaudiofile
142  Q_ASSERT(m_virtual_file);
143  if (!m_virtual_file) return;
144 
145  // enter our wrapper functions
146  m_virtual_file->closure = Q_NULLPTR;
148  m_virtual_file->write = af_file_write;
149  m_virtual_file->length = af_file_length;
150  m_virtual_file->destroy = af_file_destroy;
153 }
static void af_file_destroy(AFvirtualfile *)
static AFfileoffset af_file_seek(AFvirtualfile *vfile, AFfileoffset offset, int is_relative)
static AFfileoffset af_file_length(AFvirtualfile *vfile)
static ssize_t af_file_read(AFvirtualfile *vfile, void *data, size_t nbytes)
static ssize_t af_file_write(AFvirtualfile *vfile, const void *data, size_t nbytes)
AFvirtualfile * m_virtual_file
static AFfileoffset af_file_tell(AFvirtualfile *vfile)
static AFvirtualfile * __af_virtual_file_new(void)
Here is the call graph for this function:

◆ ~VirtualAudioFile()

Kwave::VirtualAudioFile::~VirtualAudioFile ( )
virtual

Destructor

Definition at line 200 of file VirtualAudioFile.cpp.

References close(), and m_virtual_file.

201 {
202  if (m_virtual_file) close();
203 }
AFvirtualfile * m_virtual_file
Here is the call graph for this function:

Member Function Documentation

◆ adapter()

Kwave::VirtualAudioFile * Kwave::VirtualAudioFile::adapter ( AFvirtualfile *  vfile)
static

returns a VirtualAudioFile for a libasound virtual file

Definition at line 249 of file VirtualAudioFile.cpp.

References _adapter_map.

Referenced by af_file_length(), af_file_read(), af_file_seek(), af_file_tell(), af_file_write(), and open().

250 {
251  // create a new empty map if necessary
252  if (!_adapter_map) _adapter_map =
253  new QMap<AFvirtualfile*,VirtualAudioFile*>();
254  Q_ASSERT(_adapter_map);
255  if (!_adapter_map) return Q_NULLPTR;
256 
257  // lookup in the map
258  return _adapter_map->contains(vfile) ? (*_adapter_map)[vfile] : Q_NULLPTR;
259 }
static QMap< AFvirtualfile *, Kwave::VirtualAudioFile * > * _adapter_map
Here is the caller graph for this function:

◆ close()

void Kwave::VirtualAudioFile::close ( )
virtual

Closes the file from libaudiofile side. The associated QIODevice will not be touched.

Note
This has not necessarily to be called, it will closed automatically in the destructor.

Definition at line 187 of file VirtualAudioFile.cpp.

References _adapter_map, m_file_handle, and m_virtual_file.

Referenced by Kwave::WavEncoder::encode(), and ~VirtualAudioFile().

188 {
189  // close libaudiofile stuff
190  afCloseFile(m_file_handle);
191 
192  // de-register ourself
194 
195  m_virtual_file = Q_NULLPTR;
196  m_file_handle = Q_NULLPTR;
197 }
AFvirtualfile * m_virtual_file
static QMap< AFvirtualfile *, Kwave::VirtualAudioFile * > * _adapter_map
Here is the caller graph for this function:

◆ destroy()

void Kwave::VirtualAudioFile::destroy ( )
virtual

called to close the source

Definition at line 228 of file VirtualAudioFile.cpp.

229 {
230 }

◆ file()

AFvirtualfile* Kwave::VirtualAudioFile::file ( )
inline

Returns the virtual file for use in libaudiofile

Definition at line 67 of file VirtualAudioFile.h.

67 { return m_virtual_file; }
AFvirtualfile * m_virtual_file

◆ handle()

AFfilehandle& Kwave::VirtualAudioFile::handle ( )
inline

Returns the handle for use in libaudiofile

Definition at line 64 of file VirtualAudioFile.h.

Referenced by Kwave::AudiofileDecoder::decode(), Kwave::WavDecoder::decode(), Kwave::WavEncoder::encode(), Kwave::AudiofileDecoder::open(), and Kwave::WavDecoder::open().

64 { return m_file_handle; }
Here is the caller graph for this function:

◆ lastError()

long int Kwave::VirtualAudioFile::lastError ( )
inline

Returns the last error from libaudiofile (-1 means "no error")

Definition at line 70 of file VirtualAudioFile.h.

Referenced by Kwave::WavEncoder::encode(), Kwave::AudiofileDecoder::open(), and Kwave::WavDecoder::open().

70 { return m_last_error; }
Here is the caller graph for this function:

◆ lastErrorText()

QString Kwave::VirtualAudioFile::lastErrorText ( )
inline

returns the last error text from libaudiofile, not localized

Note
this is only valid in case of lastError is not -1

Definition at line 76 of file VirtualAudioFile.h.

Referenced by Kwave::WavDecoder::open().

76 { return m_last_error_text; }
Here is the caller graph for this function:

◆ length()

qint64 Kwave::VirtualAudioFile::length ( )
virtual

returns the length of the file

Reimplemented in Kwave::RepairVirtualAudioFile.

Definition at line 214 of file VirtualAudioFile.cpp.

References m_device.

Referenced by af_file_length().

215 {
216  return m_device.size();
217 }
Here is the caller graph for this function:

◆ open()

void Kwave::VirtualAudioFile::open ( Kwave::VirtualAudioFile x,
AFfilesetup  setup 
)
virtual

opens the file through libaudiofile

Definition at line 156 of file VirtualAudioFile.cpp.

References _adapter_map, _handle_audiofile_error(), _last_audiofile_error_text, _lastAudiofileError(), adapter(), m_device, m_file_handle, m_last_error, m_last_error_text, and m_virtual_file.

Referenced by Kwave::WavEncoder::encode(), Kwave::AudiofileDecoder::open(), and Kwave::WavDecoder::open().

158 {
159  // register ourself
160  adapter(Q_NULLPTR); // dummy lookup, for creating a new map if needed
161  Q_ASSERT(_adapter_map);
162  if (_adapter_map) _adapter_map->insert(m_virtual_file, x);
163 
164  // determine the mode: rw/w/r
165  const char *mode = Q_NULLPTR;
166  if (m_device.isWritable()) mode = "w";
167  else if (m_device.isReadable()) mode = "r";
168  Q_ASSERT(mode);
169 
170  AFerrfunc old_handler;
171  old_handler = afSetErrorHandler(_handle_audiofile_error);
172 
173  // reset the file position when opening the device, otherwise libaudiofile
174  // might fail when seeking to the current position and the position of
175  // the device currently is at EOF (in libaudiofile, File::canSeek)
176  m_device.seek(0);
177 
178  // open the virtual file and get a handle for it
179  m_file_handle = afOpenVirtualFile(m_virtual_file, mode, setup);
182 
183  afSetErrorHandler(old_handler);
184 }
static Kwave::VirtualAudioFile * adapter(AFvirtualfile *vfile)
static long _lastAudiofileError()
static void _handle_audiofile_error(long int error, const char *str)
AFvirtualfile * m_virtual_file
static QString _last_audiofile_error_text
static QMap< AFvirtualfile *, Kwave::VirtualAudioFile * > * _adapter_map
Here is the call graph for this function:
Here is the caller graph for this function:

◆ read()

qint64 Kwave::VirtualAudioFile::read ( char *  data,
unsigned int  nbytes 
)
virtual

reads a block of data

Reimplemented in Kwave::RepairVirtualAudioFile.

Definition at line 206 of file VirtualAudioFile.cpp.

References m_device.

Referenced by af_file_read().

207 {
208  Q_ASSERT(data);
209  if (!data) return 0;
210  return m_device.read(data, nbytes);
211 }
Here is the caller graph for this function:

◆ seek()

qint64 Kwave::VirtualAudioFile::seek ( qint64  offset,
bool  is_relative 
)
virtual

seek to a file position

Reimplemented in Kwave::RepairVirtualAudioFile.

Definition at line 233 of file VirtualAudioFile.cpp.

References m_device.

Referenced by af_file_seek().

234 {
235  qint64 abs_pos = (is_relative) ? (m_device.pos() + offset) : offset;
236  if (abs_pos >= m_device.size())
237  return -1; // avoid seek after EOF
238  bool ok = m_device.seek(abs_pos);
239  return (ok) ? m_device.pos() : -1;
240 }
Here is the caller graph for this function:

◆ tell()

qint64 Kwave::VirtualAudioFile::tell ( )
virtual

returns the file position

Reimplemented in Kwave::RepairVirtualAudioFile.

Definition at line 243 of file VirtualAudioFile.cpp.

References m_device.

Referenced by af_file_tell().

244 {
245  return m_device.pos();
246 }
Here is the caller graph for this function:

◆ write()

qint64 Kwave::VirtualAudioFile::write ( const char *  data,
unsigned int  nbytes 
)
virtual

writes a block of data

Reimplemented in Kwave::RepairVirtualAudioFile.

Definition at line 220 of file VirtualAudioFile.cpp.

References m_device.

Referenced by af_file_write().

221 {
222  Q_ASSERT(data);
223  if (!data) return 0;
224  return m_device.write(data, nbytes);
225 }
Here is the caller graph for this function:

Member Data Documentation

◆ m_device

QIODevice& Kwave::VirtualAudioFile::m_device
private

i/o device to Qt

Definition at line 102 of file VirtualAudioFile.h.

Referenced by length(), open(), read(), seek(), tell(), and write().

◆ m_file_handle

AFfilehandle Kwave::VirtualAudioFile::m_file_handle
private

file handle used in libaudiofile

Definition at line 105 of file VirtualAudioFile.h.

Referenced by close(), and open().

◆ m_last_error

long int Kwave::VirtualAudioFile::m_last_error
private

last error code from libaudiofile

Definition at line 111 of file VirtualAudioFile.h.

Referenced by open().

◆ m_last_error_text

QString Kwave::VirtualAudioFile::m_last_error_text
private

last error text from libaudiofile

Definition at line 114 of file VirtualAudioFile.h.

Referenced by open().

◆ m_virtual_file

AFvirtualfile* Kwave::VirtualAudioFile::m_virtual_file
private

virtual file, used in libaudiofile

Definition at line 108 of file VirtualAudioFile.h.

Referenced by close(), open(), VirtualAudioFile(), and ~VirtualAudioFile().


The documentation for this class was generated from the following files: