00001 #ifndef SOUNDFILE_HPP 00002 #define SOUNDFILE_HPP 00003 00007 #include <QString> 00008 #include <QFile> 00009 #include <vector> 00010 #include <sndfile.hh> 00011 #include "types.hpp" 00012 #include "mad.h" 00013 00015 00016 class SoundfileData 00017 { 00018 public: 00019 virtual ~SoundfileData() {}; 00021 virtual QString error() const = 0; 00023 virtual real_vec read_channel(int channel) = 0; 00025 virtual size_t frames() const = 0; 00027 virtual double length() const = 0; 00029 virtual int samplerate() const = 0; 00031 virtual int channels() const = 0; 00033 virtual bool valid() const = 0; 00034 }; 00035 00037 00038 class SndfileData : public SoundfileData 00039 { 00040 public: 00041 SndfileData(const QString& fname); 00042 ~SndfileData(); 00043 QString error() const; 00044 real_vec read_channel(int channel); 00045 size_t frames() const; 00046 double length() const; //in seconds 00047 int samplerate() const; 00048 int channels() const; 00049 bool valid() const; 00050 private: 00051 SndfileHandle file_; 00052 }; 00053 00055 00056 class MP3Data : public SoundfileData 00057 { 00058 public: 00059 MP3Data(const QString& fname); 00060 QString error() const; 00061 real_vec read_channel(int channel); 00062 size_t frames() const; 00063 double length() const;//in seconds 00064 int samplerate() const; 00065 int channels() const; 00066 bool valid() const; 00067 private: 00068 void get_mp3_stats(); 00069 size_t frames_; 00070 size_t length_; 00071 int samplerate_; 00072 int channels_; 00073 QString filename_; 00074 QString error_; 00075 }; 00076 00078 00079 class Soundfile 00080 { 00081 public: 00083 00085 static QString writeSound(const QString& fname, const real_vec& data, 00086 int samplerate, int format=-1); 00087 static int guessFormat(const QString& filename); 00088 00089 Soundfile(); 00090 Soundfile(const QString& fname); 00092 void reset(); 00094 void load(const QString& fname); 00096 const QString& error() const; 00098 bool valid() const; 00100 00101 real_vec read_channel(int channel); 00103 const SoundfileData& data() const; 00104 private: 00105 SoundfileData* data_; 00106 QString error_; 00107 }; 00108 00109 #endif
1.7.1