You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
202 lines
5.3 KiB
202 lines
5.3 KiB
15 years ago
|
/***************************************************************************
|
||
|
copyright : (C) 2003 by Arnold Krille
|
||
|
email : arnold@arnoldarts.de
|
||
|
***************************************************************************/
|
||
|
|
||
|
/***************************************************************************
|
||
|
* *
|
||
|
* This program is free software; you can redistribute it and/or modify *
|
||
|
* it under the terms of the GNU General Public License as published by *
|
||
|
* the Free Software Foundation; version 2 of the License. *
|
||
|
* *
|
||
|
***************************************************************************/
|
||
|
|
||
|
#ifndef KRECFILE_H
|
||
|
#define KRECFILE_H
|
||
|
|
||
|
#include <qobject.h>
|
||
|
#include <qstring.h>
|
||
|
#include <qvaluelist.h>
|
||
|
|
||
|
#include <arts/common.h>
|
||
|
|
||
|
class KRecBuffer;
|
||
|
class KTempDir;
|
||
|
class KSimpleConfig;
|
||
|
class QFile;
|
||
|
class KRecFileViewWidget;
|
||
|
|
||
|
class KRecFile : virtual public QObject {
|
||
|
Q_OBJECT
|
||
|
friend class KRecFileWidget;
|
||
|
public:
|
||
|
KRecFile( QObject*, const char* =0 );
|
||
|
KRecFile( const QString &, QObject*, const char* =0 );
|
||
|
~KRecFile();
|
||
|
|
||
|
QString filename();
|
||
|
void filename( const QString &);
|
||
|
|
||
|
bool saved() const { return _saved; }
|
||
|
int samplerate() const { return _samplerate; }
|
||
|
int channels() const { return _channels; }
|
||
|
int bits() const { return _bits; }
|
||
|
|
||
|
QIODevice::Offset offsetSize() const { return samplesToOffset( _size ); }
|
||
|
QIODevice::Offset offsetPosition() const { return samplesToOffset( _pos ); }
|
||
|
|
||
|
int size() const { return _size; }
|
||
|
int position() const { return _pos; }
|
||
|
|
||
|
/// Calculates an offset into a frames-value depending on the files settings (channels and bits)
|
||
|
int offsetToSamples( QIODevice::Offset ) const;
|
||
|
QIODevice::Offset samplesToOffset( int ) const;
|
||
|
public slots:
|
||
|
/// Creates a new empty buffer and marks it for recording.
|
||
|
void newBuffer();
|
||
|
|
||
|
/// Deletes the buffer from the file.
|
||
|
void deleteBuffer( KRecBuffer* =0 );
|
||
|
|
||
|
void writeData( Arts::mcopbyte* data, uint length );
|
||
|
void writeData( QByteArray* );
|
||
|
void writeData( QByteArray& );
|
||
|
|
||
|
void save( const QString & );
|
||
|
void exportwave( const QString & );
|
||
|
|
||
|
/// Fills a QByteArray with values from the specified Offset.
|
||
|
QByteArray* getData( int );
|
||
|
|
||
|
void getData( QByteArray& );
|
||
|
|
||
|
void newPos( int );
|
||
|
|
||
|
private slots:
|
||
|
void newPos( KRecBuffer*, QIODevice::Offset );
|
||
|
void newSize( KRecBuffer*, QIODevice::Offset );
|
||
|
signals:
|
||
|
/// Position signals
|
||
|
void posChanged( int );
|
||
|
void sizeChanged( int );
|
||
|
/// The end of the file is reached, you should stop reading.
|
||
|
void endReached();
|
||
|
|
||
|
/// GUI-Signals
|
||
|
void sNewBuffer( KRecBuffer* );
|
||
|
void sDeleteBuffer( KRecBuffer* );
|
||
|
|
||
|
void filenameChanged( const QString & );
|
||
|
private:
|
||
|
void saveProps();
|
||
|
void loadProps();
|
||
|
/**
|
||
|
Creates a new buffer for a given file
|
||
|
@param filename Name of the file
|
||
|
*/
|
||
|
void newBuffer( const QString &filename );
|
||
|
/**
|
||
|
Adds buffer to the buffers.
|
||
|
@param buffer The to be added buffer
|
||
|
*/
|
||
|
void newBuffer( KRecBuffer* buffer );
|
||
|
|
||
|
/// Get the top-most-buffer at the specified position.
|
||
|
int getTopBuffer_int( int );
|
||
|
KRecBuffer* getTopBuffer_buffer( int );
|
||
|
|
||
|
bool _saved;
|
||
|
QString _filename;
|
||
|
int _samplerate, _channels, _bits;
|
||
|
int _currentBuffer;
|
||
|
QValueList<KRecBuffer*> _buffers;
|
||
|
KTempDir *_dir;
|
||
|
KSimpleConfig *_config;
|
||
|
int _pos, _size;
|
||
|
|
||
|
void init();
|
||
|
};
|
||
|
|
||
|
class QFile;
|
||
|
class QDir;
|
||
|
class QFileInfo;
|
||
|
class KConfig;
|
||
|
class QDataStream;
|
||
|
|
||
|
class KRecBuffer : virtual public QObject {
|
||
|
Q_OBJECT
|
||
|
public:
|
||
|
KRecBuffer( const QString &, int, bool, KRecFile*, const char* =0 );
|
||
|
~KRecBuffer();
|
||
|
|
||
|
// After how many samples in the File this Buffer starts...
|
||
|
int startpos() const;
|
||
|
|
||
|
QIODevice::Offset size() const;
|
||
|
int sizeInSamples() const { return _krecfile->offsetToSamples( size() ); }
|
||
|
|
||
|
/**
|
||
|
Writes out its Config
|
||
|
It doesn't set the group.
|
||
|
@param config the KConfig where the data gets written
|
||
|
*/
|
||
|
void writeConfig( KConfig* config );
|
||
|
|
||
|
/**
|
||
|
restores a KRecBuffer from Config
|
||
|
The group has to be set the right way.
|
||
|
@param config The configuration thats read
|
||
|
@param dir The directory where the file is saved
|
||
|
*/
|
||
|
static KRecBuffer* fromConfig( KConfig* config, QDir* dir, KRecFile* p, const char* n=0 );
|
||
|
|
||
|
QString filename() const;
|
||
|
|
||
|
bool active() const;
|
||
|
|
||
|
QString title() const;
|
||
|
QString comment() const;
|
||
|
public slots:
|
||
|
/// writes the data into the buffer
|
||
|
void writeData( Arts::mcopbyte* data, uint length );
|
||
|
void writeData( QByteArray* );
|
||
|
void writeData( QByteArray& );
|
||
|
/// gets the data from the stream
|
||
|
void getData( QByteArray& );
|
||
|
|
||
|
void setPos( QIODevice::Offset );
|
||
|
|
||
|
void setActive( bool );
|
||
|
|
||
|
void deleteBuffer();
|
||
|
|
||
|
void setTitle( const QString & );
|
||
|
void setComment( const QString & );
|
||
|
|
||
|
/// Returns the sample at the specified position and channel.
|
||
|
float getSample( int pos, int channel );
|
||
|
float* getsamples( int start, int end, int channel );
|
||
|
signals:
|
||
|
void posChanged( KRecBuffer*, QIODevice::Offset );
|
||
|
void sizeChanged( KRecBuffer*, QIODevice::Offset );
|
||
|
void activeChanged( bool );
|
||
|
|
||
|
/// Is emitted when something has changed.
|
||
|
void somethingChanged();
|
||
|
|
||
|
void deleteSelf( KRecBuffer* );
|
||
|
private:
|
||
|
KRecFile* _krecfile;
|
||
|
QFile* _file;
|
||
|
QDataStream* _stream;
|
||
|
QFileInfo* _fileinfo;
|
||
|
bool _open, _active;
|
||
|
QIODevice::Offset _pos;
|
||
|
int _start;
|
||
|
QString _title, _comment;
|
||
|
};
|
||
|
|
||
|
#endif
|
||
|
|
||
|
// vim:sw=4:ts=4
|