23 #include <QApplication> 25 #include <QMutableListIterator> 50 #define WAVE_FORMAT_PCM "audio/vnd.wave" // ; codec=001" 53 #define BUFFER_BLOCK_SIZE (4 * 1024 * 1024) 57 :QIODevice(), m_block(0), m_size(0), m_data()
70 if (atEnd() || (pos() >=
size()))
return -1;
71 if (pos() + maxlen >
size())
72 maxlen =
size() - pos();
87 quint64 new_size = pos() + len;
90 if (new_size > std::numeric_limits<unsigned int>::max())
105 if ((pos() + len) > static_cast<qint64>(mem.
sizeOf(
m_block))) {
113 static_cast<unsigned int>(pos()),
115 static_cast<unsigned int>(len)
120 if (pos() + written >
m_size)
121 m_size = pos() + written ;
130 m_data.setRawData(Q_NULLPTR, 0);
135 static_cast<const char *>(mem.
map(
m_block)) : Q_NULLPTR;
141 qWarning(
"Kwave::MimeData::Buffer::mapToByteArray() failed");
148 m_data.setRawData(raw, len);
158 m_data.setRawData(Q_NULLPTR, 0);
191 if (!encoder)
return false;
194 if (!src.
tracks())
return false;
197 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
204 new_meta_data.
shiftLeft(first, first, QList<unsigned int>());
231 QApplication::restoreOverrideCursor();
243 unsigned int decoded_tracks = 0;
246 foreach (
const QString &format, e->formats()) {
252 if (!decoder)
return 0;
254 QByteArray raw_data = e->data(format);
255 QBuffer src(&raw_data);
258 bool ok = decoder->
open(widget, src);
266 Q_ASSERT(decoded_length);
267 Q_ASSERT(decoded_tracks);
268 if (!decoded_length || !decoded_tracks) {
275 double dst_rate = sig.
rate();
279 if (!qFuzzyCompare(src_rate, dst_rate) && (dst_rate > 1) && sig.
tracks())
280 decoded_length *= (dst_rate / src_rate);
285 if (tracks.isEmpty()) tracks = sig.
allTracks();
290 qDebug(
"Kwave::MimeData::decode(...) -> new signal");
296 ok = (sig.
tracks() == decoded_tracks);
311 if (ok && (decoded_tracks != dst_tracks)) {
312 qDebug(
"Kwave::MimeData::decode(...) -> mixing channels: %u -> %u",
313 decoded_tracks, dst_tracks);
314 mixer =
new(std::nothrow)
317 ok &= (mixer) && mixer->
init();
324 if (ok && !qFuzzyCompare(src_rate, dst_rate)) {
326 qDebug(
"Kwave::MimeData::decode(...) -> rate conversion: "\
327 "%0.1f -> %0.1f", src_rate, dst_rate);
328 rate_converter =
new(std::nothrow)
331 Q_ASSERT(rate_converter);
334 QVariant(dst_rate / src_rate));
341 QApplication::setOverrideCursor(QCursor(Qt::WaitCursor));
343 if (ok && (rate_converter || mixer)) {
361 if (ok && rate_converter) {
367 last_output = rate_converter;
380 ok = decoder->
decode(widget, adapter);
387 ok = decoder->
decode(widget, dst);
393 if (mixer)
delete mixer;
394 if (rate_converter)
delete rate_converter;
397 QApplication::restoreOverrideCursor();
412 if (!qFuzzyCompare(src_rate, dst_rate))
430 return decoded_length;
#define BUFFER_BLOCK_SIZE
virtual sample_index_t first() const
int readFrom(Kwave::Handle handle, unsigned int offset, void *buffer, unsigned int length) Q_DECL_EXPORT
bool resize(Kwave::Handle handle, size_t size) Q_DECL_EXPORT
size_t sizeOf(Kwave::Handle handle) Q_DECL_EXPORT
static MemoryManager & instance() Q_DECL_EXPORT
Kwave::MimeData::Buffer m_buffer
virtual unsigned int tracks() const Q_DECL_OVERRIDE
Kwave::MetaDataList & metaData()
virtual qint64 size() const Q_DECL_OVERRIDE
virtual void close() Q_DECL_OVERRIDE
void newSignal(sample_index_t samples, double rate, unsigned int bits, unsigned int tracks)
virtual bool open(QWidget *widget, QIODevice &source)=0
bool connect(Kwave::StreamObject &source, const char *output, Kwave::StreamObject &sink, const char *input)
void set(FileProperty key, const QVariant &value)
void free(Kwave::Handle &handle) Q_DECL_EXPORT
virtual qint64 writeData(const char *data, qint64 len) Q_DECL_OVERRIDE
virtual sample_index_t last() const
static sample_index_t decode(QWidget *widget, const QMimeData *e, Kwave::SignalManager &sig, sample_index_t pos)
virtual qint64 readData(char *data, qint64 maxlen) Q_DECL_OVERRIDE
void setLength(sample_index_t length)
void setTracks(unsigned int tracks)
virtual ~Buffer() Q_DECL_OVERRIDE
virtual Kwave::MetaDataList & metaData()
const QList< unsigned int > allTracks()
virtual bool encode(QWidget *widget, Kwave::MultiTrackReader &src, QIODevice &dst, const Kwave::MetaDataList &meta_data)=0
static QString metaDataType()
virtual bool decode(QWidget *widget, Kwave::MultiWriter &dst)=0
virtual ~MimeData() Q_DECL_OVERRIDE
virtual bool encode(QWidget *widget, Kwave::MultiTrackReader &src, const Kwave::MetaDataList &meta_data)
static Kwave::Decoder * decoder(const QString &mimetype_name)
static Kwave::Encoder * encoder(const QString &mimetype_name)
void unmap(Kwave::Handle handle) Q_DECL_EXPORT
void * map(Kwave::Handle handle) Q_DECL_EXPORT
int writeTo(Kwave::Handle handle, unsigned int offset, const void *buffer, unsigned int length) Q_DECL_EXPORT
const QList< unsigned int > selectedTracks()
Kwave::Handle allocate(size_t size) Q_DECL_EXPORT
const QByteArray & byteArray() const
static bool canDecode(const QString &mimetype_name)
void setAttribute(const char *attribute, const QVariant &value)