summaryrefslogtreecommitdiffstats
path: root/libk3b/projects/audiocd/k3baudiodatasource.h
diff options
context:
space:
mode:
Diffstat (limited to 'libk3b/projects/audiocd/k3baudiodatasource.h')
-rw-r--r--libk3b/projects/audiocd/k3baudiodatasource.h168
1 files changed, 168 insertions, 0 deletions
diff --git a/libk3b/projects/audiocd/k3baudiodatasource.h b/libk3b/projects/audiocd/k3baudiodatasource.h
new file mode 100644
index 0000000..d12fd10
--- /dev/null
+++ b/libk3b/projects/audiocd/k3baudiodatasource.h
@@ -0,0 +1,168 @@
+/*
+ *
+ * $Id: k3baudiodatasource.h 619556 2007-01-03 17:38:12Z trueg $
+ * Copyright (C) 2004 Sebastian Trueg <trueg@k3b.org>
+ *
+ * This file is part of the K3b project.
+ * Copyright (C) 1998-2007 Sebastian Trueg <trueg@k3b.org>
+ *
+ * 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; either version 2 of the License, or
+ * (at your option) any later version.
+ * See the file "COPYING" for the exact licensing terms.
+ */
+
+#ifndef _K3B_AUDIO_DATA_SOURCE_H_
+#define _K3B_AUDIO_DATA_SOURCE_H_
+
+#include <k3bmsf.h>
+#include "k3b_export.h"
+class K3bAudioTrack;
+class K3bAudioDoc;
+
+
+/**
+ * An AudioDataSource has an original length which represents the maximum amount of audio
+ * sectors this source can provide (in special cases this is not true, see K3bAudioZeroData).
+ *
+ * It is possible to just use a portion of that data by changing the startOffset and endOffset.
+ * This will change the actual length of the data provided by this source through the read method.
+ *
+ * Sources are part of a list which can be traversed via the prev() and next() methods. This list
+ * is part of a K3bAudioTrack which in turn is part of a list which is owned by a K3bAudioDoc.
+ *
+ * The list may be modified with the take(), moveAfter(), and moveAhead() methods. The source takes
+ * care of fixing the list and notifying the track about the change (It is also possible to move sources
+ * from one track to the other).
+ *
+ * When a source is deleted it automatically removes itself from it's list.
+ */
+class LIBK3B_EXPORT K3bAudioDataSource
+{
+ friend class K3bAudioTrack;
+
+ public:
+ K3bAudioDataSource();
+
+ /**
+ * Create en identical copy except that the copy will not be in any list.
+ */
+ K3bAudioDataSource( const K3bAudioDataSource& );
+ virtual ~K3bAudioDataSource();
+
+ /**
+ * The original length of the source is the maximum data which is available
+ * when startOffset is 0 this is the max for endOffset
+ *
+ * Be aware that this may change (see K3bAudioZeroData)
+ */
+ virtual K3b::Msf originalLength() const = 0;
+
+ /**
+ * The default implementation returns the originalLength modified by startOffset and endOffset
+ */
+ virtual K3b::Msf length() const;
+
+ /**
+ * @return The raw size in pcm samples (16bit, 44800 kHz, stereo)
+ */
+ KIO::filesize_t size() const { return length().audioBytes(); }
+
+ virtual bool seek( const K3b::Msf& ) = 0;
+
+ /**
+ * Read data from the source.
+ */
+ virtual int read( char* data, unsigned int max ) = 0;
+
+ /**
+ * Type of the data in readable form.
+ */
+ virtual QString type() const = 0;
+
+ /**
+ * The source in readable form (this is the filename for files)
+ */
+ virtual QString sourceComment() const = 0;
+
+ /**
+ * Used in case an error occurred. For now this is used if the
+ * decoder was not able to decode an audiofile
+ */
+ virtual bool isValid() const { return true; }
+
+ /**
+ * The doc the source is currently a part of or null.
+ */
+ K3bAudioDoc* doc() const;
+ K3bAudioTrack* track() const { return m_track; }
+
+ K3bAudioDataSource* prev() const { return m_prev; }
+ K3bAudioDataSource* next() const { return m_next; }
+
+ K3bAudioDataSource* take();
+
+ void moveAfter( K3bAudioDataSource* track );
+ void moveAhead( K3bAudioDataSource* track );
+
+ /**
+ * Set the start offset from the beginning of the source's originalLength.
+ */
+ virtual void setStartOffset( const K3b::Msf& );
+
+ /**
+ * Set the end offset from the beginning of the file. The endOffset sector
+ * is not included in the data.
+ * The maximum value is originalLength() which means to use all data.
+ * 0 means the same as originalLength().
+ * This has to be bigger than the start offset.
+ */
+ virtual void setEndOffset( const K3b::Msf& );
+
+ virtual const K3b::Msf& startOffset() const { return m_startOffset; }
+
+ /**
+ * The end offset. It is the first sector not included in the data.
+ * If 0 the last sector is determined by the originalLength
+ */
+ virtual const K3b::Msf& endOffset() const { return m_endOffset; }
+
+ /**
+ * Get the last used sector in the source.
+ * The default implementation uses originalLength() and endOffset()
+ */
+ virtual K3b::Msf lastSector() const;
+
+ /**
+ * Create a copy of this source which is not part of a list
+ */
+ virtual K3bAudioDataSource* copy() const = 0;
+
+ /**
+ * Split the source at position pos and return the splitted source
+ * on success.
+ * The new source will be moved after this source.
+ *
+ * The default implementation uses copy() to create a new source instance
+ */
+ virtual K3bAudioDataSource* split( const K3b::Msf& pos );
+
+ protected:
+ /**
+ * Informs the parent track about changes.
+ */
+ void emitChange();
+
+ private:
+ void fixupOffsets();
+
+ K3bAudioTrack* m_track;
+ K3bAudioDataSource* m_prev;
+ K3bAudioDataSource* m_next;
+
+ K3b::Msf m_startOffset;
+ K3b::Msf m_endOffset;
+};
+
+#endif