00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef RESAMPLEAUDIOREADER_H
00023 #define RESAMPLEAUDIOREADER_H
00024
00025 #include <AbstractAudioReader.h>
00026 #include <QVector>
00027 #include <samplerate.h>
00028
00029
00030 class ResampleAudioReader : public AbstractAudioReader
00031 {
00032
00033 public:
00034 ResampleAudioReader(QString filename, const QString& decoder);
00035 ~ResampleAudioReader();
00036
00037 nframes_t read_from(DecodeBuffer* buffer, nframes_t start, nframes_t count) {
00038 return AbstractAudioReader::read_from(buffer, start, count);
00039 }
00040 nframes_t read_from(DecodeBuffer* buffer, const TimeRef& start, nframes_t count) {
00041 TimeRef location = start;
00042 return AbstractAudioReader::read_from(buffer, location.to_frame(m_outputRate), count);
00043 }
00044 QString decoder_type() const {return (m_reader) ? m_reader->decoder_type() : "";}
00045 void clear_buffers();
00046
00047 int get_output_rate();
00048 int get_file_rate();
00049 int get_convertor_type() const {return m_convertorType;}
00050 void set_output_rate(int rate);
00051 void set_converter_type(int converter_type);
00052 void set_resample_decode_buffer(DecodeBuffer* buffer);
00053
00054 protected:
00055 void reset();
00056
00057 bool seek_private(nframes_t start);
00058 nframes_t read_private(DecodeBuffer* buffer, nframes_t frameCount);
00059
00060 nframes_t resampled_to_file_frame(nframes_t frame);
00061 nframes_t file_to_resampled_frame(nframes_t frame);
00062
00063 AbstractAudioReader* m_reader;
00064 QVector<SRC_STATE*> m_srcStates;
00065 SRC_DATA m_srcData;
00066 audio_sample_t** m_overflowBuffers;
00067 long m_overflowUsed;
00068 int m_outputRate;
00069 int m_convertorType;
00070 bool m_isResampleAvailable;
00071 nframes_t m_readExtraFrames;
00072
00073 private:
00074 void create_overflow_buffers();
00075 DecodeBuffer* m_resampleDecodeBuffer;
00076 bool m_resampleDecodeBufferIsMine;
00077 };
00078
00079 #endif