00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef ABSTRACTAUDIOREADER_H
00023 #define ABSTRACTAUDIOREADER_H
00024
00025 #include "defines.h"
00026
00027 #include <QString>
00028
00029 class DecodeBuffer {
00030
00031 public:
00032 DecodeBuffer();
00033 ~DecodeBuffer() {
00034 delete_destination_buffers();
00035 delete_readbuffer();
00036 }
00037
00038 void check_buffers_capacity(uint size, uint channels);
00039
00040 audio_sample_t** destination;
00041 audio_sample_t* readBuffer;
00042 uint destinationBufferSize;
00043 uint readBufferSize;
00044
00045 private:
00046 uint m_channels;
00047 uint m_smallerReadCounter;
00048 quint64 m_totalCheckSize;
00049 uint m_bufferSizeCheckCounter;
00050
00051 void delete_destination_buffers();
00052 void delete_readbuffer();
00053 void delete_resample_buffers();
00054
00055 };
00056
00057 class AbstractAudioReader
00058 {
00059
00060 public:
00061 AbstractAudioReader(const QString& filename);
00062 virtual ~AbstractAudioReader();
00063
00064 int get_num_channels();
00065 const TimeRef& get_length() const {return m_length;}
00066 nframes_t get_nframes() const {return m_nframes;}
00067 int get_file_rate();
00068 bool eof();
00069 nframes_t pos();
00070
00071 nframes_t read_from(DecodeBuffer* buffer, nframes_t start, nframes_t count);
00072 bool seek(nframes_t start);
00073 nframes_t read(DecodeBuffer* buffer, nframes_t frameCount);
00074
00075 bool is_valid() {return (m_channels > 0 && m_nframes > 0);}
00076 virtual QString decoder_type() const = 0;
00077 virtual void clear_buffers() {}
00078
00079 static AbstractAudioReader* create_audio_reader(const QString& filename, const QString& decoder = 0);
00080
00081 protected:
00082 virtual bool seek_private(nframes_t start) = 0;
00083 virtual nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount) = 0;
00084
00085 QString m_fileName;
00086
00087 nframes_t m_readPos;
00088 int m_channels;
00089 TimeRef m_length;
00090 nframes_t m_nframes;
00091 int m_rate;
00092 };
00093
00094 #endif