[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Traverso-commit] traverso/src core/WriteSource.cpp audiofileio/a...,
Ben Levitt <=