traverso-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Traverso-commit] traverso/src/core AbstractAudioReader.h MonoRea...


From: Ben Levitt
Subject: [Traverso-commit] traverso/src/core AbstractAudioReader.h MonoRea...
Date: Sat, 07 Jul 2007 22:00:13 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Ben Levitt <benjie>     07/07/07 22:00:13

Modified files:
        src/core       : AbstractAudioReader.h MonoReader.cpp 
                         ResampleAudioReader.cpp ResampleAudioReader.h 
                         SFAudioReader.cpp SFAudioReader.h 
                         VorbisAudioReader.cpp VorbisAudioReader.h 

Log message:
        Fix vorbis reader, resample reader

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/AbstractAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/MonoReader.cpp?cvsroot=traverso&r1=1.18&r2=1.19
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.cpp?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/ResampleAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.cpp?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/SFAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.cpp?cvsroot=traverso&r1=1.1&r2=1.2
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/VorbisAudioReader.h?cvsroot=traverso&r1=1.1&r2=1.2

Patches:
Index: AbstractAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/AbstractAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- AbstractAudioReader.h       6 Jul 2007 22:13:32 -0000       1.1
+++ AbstractAudioReader.h       7 Jul 2007 22:00:12 -0000       1.2
@@ -41,7 +41,7 @@
        virtual bool is_compressed() = 0;
        int read_from(audio_sample_t* dst, nframes_t start, nframes_t cnt);
        virtual bool seek(nframes_t start) = 0;
-       virtual int read(audio_sample_t* dst, nframes_t cnt) = 0;
+       virtual int read(audio_sample_t* dst, int sampleCount) = 0;
 
        static AbstractAudioReader* create_audio_reader(QString filename);
        static AbstractAudioReader* create_resampled_audio_reader(QString 
filename);

Index: MonoReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/MonoReader.cpp,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -b -r1.18 -r1.19
--- MonoReader.cpp      6 Jul 2007 22:13:32 -0000       1.18
+++ MonoReader.cpp      7 Jul 2007 22:00:13 -0000       1.19
@@ -155,6 +155,7 @@
        nread /= m_audioReader->get_num_channels();
 
        /* stride through the interleaved data */
+       // FIXME: deinterlace in AudioReader Classes instead of here
 
        for (int32_t n = 0; n < nread; ++n) {
                dst[n] = *ptr;

Index: ResampleAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- ResampleAudioReader.cpp     6 Jul 2007 22:13:32 -0000       1.1
+++ ResampleAudioReader.cpp     7 Jul 2007 22:00:13 -0000       1.2
@@ -126,37 +126,40 @@
 
 
 // 
-int ResampleAudioReader::read(audio_sample_t* dst, nframes_t cnt)
+int ResampleAudioReader::read(audio_sample_t* dst, int sampleCount)
 {
        Q_ASSERT(m_realReader);
 
        if (audiodevice().get_sample_rate() == m_realReader->get_rate()) {
-               return m_realReader->read(dst, cnt);
+               return m_realReader->read(dst, sampleCount);
        }
        
-       nframes_t fileCnt = song_to_file_frame(cnt) + 4;
+       // The +1 means decode a tiny bit extra from the file to make sure we 
can get enough resampled data
+       nframes_t fileCnt = (song_to_file_frame(sampleCount / 
get_num_channels()) +1) * get_num_channels();
        
        // make sure that the reusable m_fileBuffer is big enough for this read
        if (m_fileBufferLength < fileCnt) {
                if (m_fileBuffer) {
                        delete m_fileBuffer;
                }
-               m_fileBuffer = new audio_sample_t[fileCnt * get_num_channels()];
+               m_fileBuffer = new audio_sample_t[fileCnt];
                m_fileBufferLength = fileCnt;
        }
        
-       if (cnt) printf("nextFrame = %lu, fileCnt = %lu\n", m_nextFrame, 
fileCnt);
        int samplesRead;
-       samplesRead = m_realReader->read_from(m_fileBuffer, m_nextFrame, 
fileCnt);
-       if (cnt) printf("samplesRead = %d\n", samplesRead);
-       // FIXME: Why does samplesRead==0 when it shouldn't???
+       samplesRead = m_realReader->read(m_fileBuffer, fileCnt);
        
-       m_nextFrame += samplesRead / get_num_channels();
+       if (samplesRead == fileCnt) {
+               m_nextFrame += sampleCount / get_num_channels();
+       }
+       else {
+               m_nextFrame += file_to_song_frame(samplesRead) / 
get_num_channels();
+       }
        
        m_srcData.data_in = m_fileBuffer;
        m_srcData.input_frames = samplesRead / get_num_channels();
        m_srcData.data_out = dst;
-       m_srcData.output_frames = cnt;
+       m_srcData.output_frames = sampleCount / get_num_channels();
        m_srcData.src_ratio = (double) audiodevice().get_sample_rate() / 
m_realReader->get_rate();
        src_set_ratio(m_srcState, m_srcData.src_ratio);
        

Index: ResampleAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/ResampleAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- ResampleAudioReader.h       6 Jul 2007 22:13:32 -0000       1.1
+++ ResampleAudioReader.h       7 Jul 2007 22:00:13 -0000       1.2
@@ -37,7 +37,7 @@
        int get_rate();
        bool is_compressed();
        bool seek(nframes_t start);
-       int read(audio_sample_t* dst, nframes_t cnt);
+       int read(audio_sample_t* dst, int sampleCount);
 
        // Shouldn't ever actually get called
        static bool can_decode(QString filename) {return false;}

Index: SFAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- SFAudioReader.cpp   6 Jul 2007 22:13:32 -0000       1.1
+++ SFAudioReader.cpp   7 Jul 2007 22:00:13 -0000       1.2
@@ -132,11 +132,13 @@
 }
 
 
-int SFAudioReader::read(audio_sample_t* dst, nframes_t cnt)
+int SFAudioReader::read(audio_sample_t* dst, int sampleCount)
 {
        Q_ASSERT(m_sf);
        
-       int samplesRead = sf_read_float (m_sf, dst, cnt);
+       int samplesRead = sf_read_float (m_sf, dst, sampleCount);
+       
+       // FIXME: deinterlace here instead of in MonoReader
        
        m_nextFrame += samplesRead / get_num_channels();
        

Index: SFAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/SFAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- SFAudioReader.h     6 Jul 2007 22:13:32 -0000       1.1
+++ SFAudioReader.h     7 Jul 2007 22:00:13 -0000       1.2
@@ -37,7 +37,7 @@
        int get_rate();
        bool is_compressed();
        bool seek(nframes_t start);
-       int read(audio_sample_t* dst, nframes_t cnt);
+       int read(audio_sample_t* dst, int sampleCount);
 
        static bool can_decode(QString filename);
 

Index: VorbisAudioReader.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- VorbisAudioReader.cpp       6 Jul 2007 22:13:32 -0000       1.1
+++ VorbisAudioReader.cpp       7 Jul 2007 22:00:13 -0000       1.2
@@ -37,17 +37,19 @@
 VorbisAudioReader::VorbisAudioReader(QString filename)
  : AbstractAudioReader(filename)
 {
-       m_file = fopen(QFile::encodeName(filename), "r");
+       m_file = fopen(QFile::encodeName(filename).data(), "rb");
        if (!m_file) {
                PERROR("Couldn't open file %s.", QS_C(filename));
                return;
        }
        
-       if (ov_open(m_file, &m_vf, NULL, 0) < 0) {
+       if (ov_open(m_file, &m_vf, 0, 0) < 0) {
                PERROR("Input does not appear to be an Ogg bitstream.");
+               fclose(m_file);
                return;
        }
 
+       ov_pcm_seek(&m_vf, 0);
        m_vi = ov_info(&m_vf,-1);
 }
 
@@ -56,14 +58,13 @@
 {
        if (m_file) {
                ov_clear(&m_vf);
-               fclose(m_file);
        }
 }
 
 
 bool VorbisAudioReader::can_decode(QString filename)
 {
-       FILE* file = fopen(QFile::encodeName(filename), "r");
+       FILE* file = fopen(QFile::encodeName(filename).data(), "rb");
        if (!file) {
                PERROR("Could not open file: %s.", QS_C(filename));
                return false;
@@ -77,7 +78,6 @@
        }
        
        ov_clear(&of);
-       fclose(file);
        
        return true;
 }
@@ -95,7 +95,7 @@
 int VorbisAudioReader::get_length()
 {
        if (m_file) {
-               return ov_pcm_total(&m_vf, -1) / get_num_channels();
+               return ov_pcm_total(&m_vf, -1);
        }
        return 0;
 }
@@ -124,9 +124,9 @@
        if (start >= get_length()) {
                return false;
        }
-       //printf("seek to %lu\n", start);
-       if (ov_pcm_seek(&m_vf, start) < 0) {
-               PERROR("VorbisAudioReader: could not seek to frame %d within 
%s", start, QS_C(m_fileName));
+       
+       if (int result = ov_pcm_seek(&m_vf, start) < 0) {
+               PERROR("VorbisAudioReader: could not seek to frame %d within %s 
(%d)", start, QS_C(m_fileName), result);
                return false;
        }
        
@@ -136,40 +136,42 @@
 }
 
 
-int VorbisAudioReader::read(audio_sample_t* dst, nframes_t cnt)
+int VorbisAudioReader::read(audio_sample_t* dst, int sampleCount)
 {
        Q_ASSERT(m_file);
        
+       nframes_t totalRead = 0;
+       
+       while (totalRead < sampleCount) {
        audio_sample_t** tmp;
        int bs;
-       
-       int samplesRead = ov_read_float (&m_vf, &tmp, cnt, &bs);
+               int samplesRead = ov_read_float(&m_vf, &tmp, (sampleCount - 
totalRead) / get_num_channels(), &bs);
        
        if (samplesRead == OV_HOLE) {
                PERROR("VorbisAudioReader: OV_HOLE");
                // recursive new try
-               return read(dst, cnt);
+                       return read(dst, sampleCount);
        }
        else if (samplesRead == 0) {
                /* EOF */
-               return 0;
+                       break;
        } else if (samplesRead < 0) {
                /* error in the stream. */
-               return 0;
+                       break;
        }
        
-       int frames = samplesRead/get_num_channels();
+               // FIXME: Instead of interlacing here, deinterlace in other 
AudioReaders!! (since we deinterlace later anyway)
+               int frames = samplesRead;
        for (int f=0; f < frames; f++) {
                for (int c=0; c < get_num_channels(); c++) {
-                       dst[f * get_num_channels() + c] = tmp[c][f];
+                               dst[totalRead + f * get_num_channels() + c] = 
tmp[c][f];
                }
        }
+               totalRead += samplesRead * get_num_channels();
+       }
        
-       //printf("SFAudioReader: cnt = %lu, samplesRead = %d, length = %lu\n", 
cnt, samplesRead, get_length());
-       
-       // m_nextFrame currently exists just for debugging
-       m_nextFrame += frames;
+       m_nextFrame += totalRead / get_num_channels();
        
-       return samplesRead;
+       return totalRead;
 }
 

Index: VorbisAudioReader.h
===================================================================
RCS file: /sources/traverso/traverso/src/core/VorbisAudioReader.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -b -r1.1 -r1.2
--- VorbisAudioReader.h 6 Jul 2007 22:13:32 -0000       1.1
+++ VorbisAudioReader.h 7 Jul 2007 22:00:13 -0000       1.2
@@ -39,7 +39,7 @@
        int get_rate();
        bool is_compressed();
        bool seek(nframes_t start);
-       int read(audio_sample_t* dst, nframes_t cnt);
+       int read(audio_sample_t* dst, int sampleCount);
 
        static bool can_decode(QString filename);
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]