traverso-commit
[Top][All Lists]
Advanced

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

[Traverso-commit] traverso/src core/WriteSource.cpp audiofileio/a...


From: Ben Levitt
Subject: [Traverso-commit] traverso/src core/WriteSource.cpp audiofileio/a...
Date: Sat, 11 Aug 2007 21:45:29 +0000

CVSROOT:        /sources/traverso
Module name:    traverso
Changes by:     Ben Levitt <benjie>     07/08/11 21:45:29

Modified files:
        src/core       : WriteSource.cpp 
        src/audiofileio: audiofileio.pro 
        src/audiofileio/encode: AbstractAudioWriter.cpp 
                                AbstractAudioWriter.h SFAudioWriter.cpp 
                                SFAudioWriter.h 
Added files:
        src/audiofileio/encode: WPAudioWriter.cpp WPAudioWriter.h 

Log message:
        Add WavPack writing in WPAudioWriter class
        Update AbstractAudioWriter and friends to:
         - include a default file extension per writer class
         - print an error on invalid extra format info
         - not write into a null buffer

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/traverso/src/core/WriteSource.cpp?cvsroot=traverso&r1=1.26&r2=1.27
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/audiofileio.pro?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/encode/AbstractAudioWriter.cpp?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/encode/AbstractAudioWriter.h?cvsroot=traverso&r1=1.3&r2=1.4
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/encode/SFAudioWriter.cpp?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/encode/SFAudioWriter.h?cvsroot=traverso&r1=1.2&r2=1.3
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/encode/WPAudioWriter.cpp?cvsroot=traverso&rev=1.1
http://cvs.savannah.gnu.org/viewcvs/traverso/src/audiofileio/encode/WPAudioWriter.h?cvsroot=traverso&rev=1.1

Patches:
Index: core/WriteSource.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/core/WriteSource.cpp,v
retrieving revision 1.26
retrieving revision 1.27
diff -u -b -r1.26 -r1.27
--- core/WriteSource.cpp        3 Aug 2007 23:05:03 -0000       1.26
+++ core/WriteSource.cpp        11 Aug 2007 21:45:28 -0000      1.27
@@ -263,11 +263,6 @@
                delete m_writer;
        }
        
-       QString name = m_fileName;
-       if (m_spec->isRecording) {
-               name.append("-ch" + QByteArray::number(m_channelNumber) + 
".wav");
-       }
-       
        if (m_writer) {
                delete m_writer;
        }
@@ -279,11 +274,18 @@
        
        QString key;
        foreach (key, m_spec->extraFormat.keys()) {
-               m_writer->set_format_attribute(key, m_spec->extraFormat[key]);
+               if (m_writer->set_format_attribute(key, 
m_spec->extraFormat[key]) == false) {
+                       printf("Invalid Extra Format Info: %s=%s\n", QS_C(key), 
QS_C(m_spec->extraFormat[key]));
+               }
        }
        
        /* XXX make sure we have enough disk space for the output */
 
+       QString name = m_fileName;
+       if (m_spec->isRecording) {
+               name.append("-ch" + QByteArray::number(m_channelNumber) + "." + 
m_writer->get_default_extension());
+       }
+       
        if (m_writer->open(name) == false) {
                return -1;
        }

Index: audiofileio/audiofileio.pro
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/audiofileio.pro,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- audiofileio/audiofileio.pro 3 Aug 2007 02:39:35 -0000       1.2
+++ audiofileio/audiofileio.pro 11 Aug 2007 21:45:28 -0000      1.3
@@ -18,7 +18,8 @@
        decode/WPAudioReader.cpp \
        decode/MadAudioReader.cpp \
        encode/AbstractAudioWriter.cpp \
-       encode/SFAudioWriter.cpp
+       encode/SFAudioWriter.cpp \
+       encode/WPAudioWriter.cpp
 HEADERS = decode/AbstractAudioReader.h \
        decode/SFAudioReader.h \
        decode/FlacAudioReader.h \
@@ -27,7 +28,8 @@
        decode/WPAudioReader.h \
        decode/MadAudioReader.h \
        encode/AbstractAudioWriter.h \
-       encode/SFAudioWriter.h
+       encode/SFAudioWriter.h \
+       encode/WPAudioWriter.h
 macx{
     QMAKE_LIBDIR += /usr/local/qt/lib
 }

Index: audiofileio/encode/AbstractAudioWriter.cpp
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/encode/AbstractAudioWriter.cpp,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- audiofileio/encode/AbstractAudioWriter.cpp  4 Aug 2007 04:21:27 -0000       
1.3
+++ audiofileio/encode/AbstractAudioWriter.cpp  11 Aug 2007 21:45:28 -0000      
1.4
@@ -21,7 +21,7 @@
 
 #include "AbstractAudioWriter.h"
 #include "SFAudioWriter.h"
-//#include "WPAudioWriter.h"
+#include "WPAudioWriter.h"
 
 #include <QString>
 
@@ -105,7 +105,7 @@
 
 nframes_t AbstractAudioWriter::write(void* buffer, nframes_t count)
 {
-       if (count) {
+       if (buffer && count) {
                nframes_t framesWritten = write_private(buffer, count);
                
                if (framesWritten > 0) {
@@ -125,10 +125,10 @@
        if (type == "sf") {
                return new SFAudioWriter();
        }
-       /*else if (type == "wp") {
+       else if (type == "wp") {
                return new WPAudioWriter();
        }
-       else if (type == "mad") {
+       /*else if (type == "mad") {
                return new MadAudioWriter();
        }
        else if (type == "flac") {

Index: audiofileio/encode/AbstractAudioWriter.h
===================================================================
RCS file: 
/sources/traverso/traverso/src/audiofileio/encode/AbstractAudioWriter.h,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -b -r1.3 -r1.4
--- audiofileio/encode/AbstractAudioWriter.h    4 Aug 2007 04:21:27 -0000       
1.3
+++ audiofileio/encode/AbstractAudioWriter.h    11 Aug 2007 21:45:28 -0000      
1.4
@@ -36,6 +36,8 @@
        AbstractAudioWriter();
        ~AbstractAudioWriter();
        
+       virtual const char* get_default_extension() = 0;
+       
        void set_num_channels(int channels);
        void set_bits_per_sample(int bits);
        void set_rate(int rate);
@@ -49,7 +51,6 @@
        static AbstractAudioWriter* create_audio_writer(const QString& type);
        
 protected:
-       virtual bool is_valid_format() = 0;
        virtual bool open_private() = 0;
        virtual nframes_t write_private(void* buffer, nframes_t frameCount) = 0;
        virtual void close_private() = 0;

Index: audiofileio/encode/SFAudioWriter.cpp
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/encode/SFAudioWriter.cpp,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- audiofileio/encode/SFAudioWriter.cpp        3 Aug 2007 23:05:03 -0000       
1.2
+++ audiofileio/encode/SFAudioWriter.cpp        11 Aug 2007 21:45:28 -0000      
1.3
@@ -43,15 +43,9 @@
 }
 
 
-bool SFAudioWriter::is_valid_format()
+const char* SFAudioWriter::get_default_extension()
 {
-       memset (&m_sfinfo, 0, sizeof(m_sfinfo));
-       m_sfinfo.format = get_sf_format();
-       m_sfinfo.samplerate = m_rate;
-       m_sfinfo.channels = m_channels;
-       //m_sfinfo.frames = m_spec->end_frame - m_spec->start_frame + 1;
-       
-       return sf_format_check(&m_sfinfo);
+       return "wav";
 }
 
 

Index: audiofileio/encode/SFAudioWriter.h
===================================================================
RCS file: /sources/traverso/traverso/src/audiofileio/encode/SFAudioWriter.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -b -r1.2 -r1.3
--- audiofileio/encode/SFAudioWriter.h  3 Aug 2007 23:05:03 -0000       1.2
+++ audiofileio/encode/SFAudioWriter.h  11 Aug 2007 21:45:28 -0000      1.3
@@ -37,8 +37,8 @@
        SFAudioWriter();
        ~SFAudioWriter();
        
-       bool is_valid_format();
        bool set_format_attribute(const QString& key, const QString& value);
+       const char* get_default_extension();
        
 protected:
        bool open_private();

Index: audiofileio/encode/WPAudioWriter.cpp
===================================================================
RCS file: audiofileio/encode/WPAudioWriter.cpp
diff -N audiofileio/encode/WPAudioWriter.cpp
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ audiofileio/encode/WPAudioWriter.cpp        11 Aug 2007 21:45:28 -0000      
1.1
@@ -0,0 +1,173 @@
+/*
+Copyright (C) 2007 Ben Levitt 
+
+This file is part of Traverso
+
+Traverso 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.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
+
+*/
+
+#include "WPAudioWriter.h"
+
+#include <QString>
+
+// Always put me below _all_ includes, this is needed
+// in case we run with memory leak detection enabled!
+#include "Debugger.h"
+
+
+WPAudioWriter::WPAudioWriter()
+ : AbstractAudioWriter()
+{
+       m_wp = 0;
+}
+
+
+WPAudioWriter::~WPAudioWriter()
+{
+       if (m_wp) {
+               close_private();
+       }
+}
+
+
+const char* WPAudioWriter::get_default_extension()
+{
+       return "wv";
+}
+
+
+bool WPAudioWriter::open_private()
+{
+       m_file = fopen(m_fileName.toUtf8().data(), "wb");
+       if (!m_file) {
+               PERROR("Couldn't open file %s.", m_fileName.toUtf8().data());
+               return false;
+       }
+       
+       m_wp = WavpackOpenFileOutput(WPAudioWriter::write_block, (void *)this, 
NULL);
+       if (!m_wp) {
+               fclose(m_file);
+               return false;
+       }
+
+       memset (&m_config, 0, sizeof(m_config));
+       m_config.bytes_per_sample = (m_sampleWidth == 1) ? 4 : m_sampleWidth/8;
+       m_config.bits_per_sample = (m_sampleWidth == 1) ? 32 : m_sampleWidth;
+       m_config.channel_mask = (m_channels == 2) ? 3 : 4; // Microsoft 
standard (mono = 4, stereo = 3)
+       m_config.num_channels = m_channels;
+       m_config.sample_rate = m_rate;
+       WavpackSetConfiguration(m_wp, &m_config, -1);
+       
+       if (!WavpackPackInit(m_wp)) {
+               fclose(m_file);
+               WavpackCloseFile(m_wp);
+               m_wp = 0;
+               return false;
+       }
+       
+       m_bytesWritten = 0;
+       
+       return true;
+}
+
+
+int WPAudioWriter::write_to_file(void *lpBuffer, uint32_t 
nNumberOfBytesToWrite, uint32_t *lpNumberOfBytesWritten)
+{
+       uint32_t bcount;
+       
+       *lpNumberOfBytesWritten = 0;
+       
+       while (nNumberOfBytesToWrite) {
+               bcount = fwrite((uchar *) lpBuffer + *lpNumberOfBytesWritten, 
1, nNumberOfBytesToWrite, m_file);
+       
+               if (bcount) {
+                       *lpNumberOfBytesWritten += bcount;
+                       nNumberOfBytesToWrite -= bcount;
+               }
+               else {
+                       break;
+               }
+       }
+       int err = ferror(m_file);
+       return !err;
+}
+
+
+int WPAudioWriter::write_block(void *id, void *data, int32_t length)
+{
+       WPAudioWriter* writer = (WPAudioWriter*) id;
+       uint32_t bcount;
+       
+       if (writer && writer->m_file && data && length) {
+               if (!writer->write_to_file(data, (uint32_t)length, 
(uint32_t*)&bcount) || bcount != (uint32_t)length) {
+                       fclose(writer->m_file);
+                       writer->m_wp = 0;
+                       return false;
+               }
+               else {
+                       writer->m_bytesWritten += length;
+               }
+       }
+
+       return true;
+}
+
+
+nframes_t WPAudioWriter::write_private(void* buffer, nframes_t frameCount)
+{
+       // FIXME:
+       // Instead of this block, add an option to gdither to leave each
+       // 8bit or 16bit sample in a 0-padded, int32_t
+       // 
+       if (m_sampleWidth > 1 && m_sampleWidth < 24) { // Not float, or 32bit 
int, or 24bit int
+               int32_t *tmp_buffer = new int32_t[frameCount * m_channels];
+               for (nframes_t s = 0; s < frameCount * m_channels; s++) {
+                       switch (m_sampleWidth) {
+                               case 8:
+                                       tmp_buffer[s] = ((int8_t*)buffer)[s];
+                                       break;
+                               case 16:
+                                       tmp_buffer[s] = ((int16_t*)buffer)[s];
+                                       break;
+                               //case 24:
+                               //      tmp_buffer[s] = ((int32_t*)buffer)[s]; 
//FIXME: does this need to read 3 bytes at a time??
+                               //      break;
+                       }
+               }
+               WavpackPackSamples(m_wp, tmp_buffer, frameCount);
+               delete tmp_buffer;
+               return frameCount;
+       }
+       
+       WavpackPackSamples(m_wp, (int32_t *)buffer, frameCount);
+       return frameCount;
+}
+
+
+void WPAudioWriter::close_private()
+{
+       WavpackFlushSamples(m_wp);
+       
+       // FIXME: Update stored num samples
+       // First Re-read first block
+       // Then WavpackUpdateNumSamples(m_wp, firstBlock);
+       // Then Re-write first block
+
+       WavpackCloseFile(m_wp);
+       fclose(m_file);
+       m_wp = 0;
+}
+

Index: audiofileio/encode/WPAudioWriter.h
===================================================================
RCS file: audiofileio/encode/WPAudioWriter.h
diff -N audiofileio/encode/WPAudioWriter.h
--- /dev/null   1 Jan 1970 00:00:00 -0000
+++ audiofileio/encode/WPAudioWriter.h  11 Aug 2007 21:45:29 -0000      1.1
@@ -0,0 +1,56 @@
+/*
+Copyright (C) 2007 Ben Levitt 
+
+This file is part of Traverso
+
+Traverso 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.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA.
+
+*/
+
+#ifndef WPAUDIOWRITER_H
+#define WPAUDIOWRITER_H
+
+#include "AbstractAudioWriter.h"
+
+#include "defines.h"
+#include "wavpack/wavpack.h"
+
+class QString;
+
+class WPAudioWriter : public AbstractAudioWriter
+{
+       Q_OBJECT
+       
+public:
+       WPAudioWriter();
+       ~WPAudioWriter();
+       
+       const char* get_default_extension();
+       
+protected:
+       bool open_private();
+       nframes_t write_private(void* buffer, nframes_t frameCount);
+       void close_private();
+       int write_to_file(void *lpBuffer, uint32_t nNumberOfBytesToWrite, 
uint32_t *lpNumberOfBytesWritten);
+       
+       static int write_block(void *id, void *data, int32_t length);
+       
+       WavpackConfig   m_config;
+       WavpackContext* m_wp;
+       int32_t m_bytesWritten;
+       FILE*           m_file;
+};
+
+#endif




reply via email to

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