summaryrefslogtreecommitdiffstats
path: root/krec/krecexport_wave.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'krec/krecexport_wave.cpp')
-rw-r--r--krec/krecexport_wave.cpp135
1 files changed, 135 insertions, 0 deletions
diff --git a/krec/krecexport_wave.cpp b/krec/krecexport_wave.cpp
new file mode 100644
index 00000000..80ea63d7
--- /dev/null
+++ b/krec/krecexport_wave.cpp
@@ -0,0 +1,135 @@
+/***************************************************************************
+ copyright : (C) 2003 by Arnold Krille
+ email : arnold@arnoldarts.de
+ ***************************************************************************/
+
+/***************************************************************************
+ * *
+ * This program 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; version 2 of the License. *
+ * *
+ ***************************************************************************/
+
+#include "krecexport_wave.h"
+#include "krecexport_wave.moc"
+
+#include "krecglobal.h"
+
+#include <kdebug.h>
+#include <ktempfile.h>
+#include <qfile.h>
+#include <qtimer.h>
+#include <kgenericfactory.h>
+
+K_EXPORT_COMPONENT_FACTORY( libkrecexport_wave, KGenericFactory<KRecExport_Wave> )
+
+KRecExport_Wave krecExportWave( 0 );
+
+KRecExport_Wave::KRecExport_Wave( QObject* p, const char* n, const QStringList& )
+ : KRecExportItem( p,n )
+ , _file( 0 )
+{
+kdDebug( 60005 ) << k_funcinfo << endl;
+ registerAtGlobal( this );
+kdDebug( 60005 ) << "Registered Exports: " << KRecGlobal::the()->exportFormats() << endl;
+}
+KRecExport_Wave::~KRecExport_Wave() {
+kdDebug( 60005 ) << k_funcinfo << endl;
+}
+
+KRecExport_Wave* KRecExport_Wave::newItem() {
+kdDebug( 60005 ) << k_funcinfo << endl;
+ return new KRecExport_Wave( 0 );
+}
+
+QStringList KRecExport_Wave::extensions() {
+ //kdDebug( 60005 ) << k_funcinfo << endl;
+ QStringList tmp;
+ tmp << "*.wav" << "*.WAV";
+ return tmp;
+}
+
+bool KRecExport_Wave::initialize( const QString &filename ) {
+kdDebug( 60005 ) << k_funcinfo << endl;
+ if ( !_file ) {
+ _file = new QFile( filename );
+ if ( _file->open( IO_Raw|IO_WriteOnly ) ) {
+ /// Write an empty Wave-header...
+ for ( int i=0; i<44; i++ )
+ _file->putch( 0 );
+ } else return false;
+ return true;
+ } else return false;
+}
+bool KRecExport_Wave::process() {
+ //kdDebug( 60005 ) << k_funcinfo << running << endl;
+ if ( _file ) {
+ if ( running() ) {
+ QByteArray bytearray( 4096 );
+ emit getData( bytearray );
+ _file->writeBlock( bytearray );
+ QTimer::singleShot( 10, this, SLOT( process() ) );
+ }
+ return true;
+ } else return false;
+}
+bool KRecExport_Wave::finalize() {
+kdDebug( 60005 ) << k_funcinfo << endl;
+ if ( _file ) {
+ // PCM-Compatible WAVE Header
+ // bytes variable description
+ // 0 - 3 'RIFF'
+ // 4 - 7 wRiffLength length of file minus the 8 byte riff header
+ // 8 - 11 'WAVE'
+ // 12 - 15 'fmt '
+ // 16 - 19 wFmtSize length of format chunk minus 8 byte header
+ // 20 - 21 wFormatTag identifies PCM, ULAW etc
+ // 22 - 23 wChannels number of channels
+ // 24 - 27 dwSamplesPerSecond samples per second per channel
+ // 28 - 31 dwAvgBytesPerSec non-trivial for compressed formats
+ // 32 - 33 wBlockAlign basic block size
+ // 34 - 35 wBitsPerSample non-trivial for compressed formats
+ // 36 - 39 'data'
+ // 40 - 43 dwDataLength length of data chunk minus 8 byte header
+ // 44 - (dwDataLength + 43) the data
+
+ // Basic 16b,2c,44kHz Wave-Header
+ char riffHeader[] =
+ {
+ 0x52, 0x49, 0x46, 0x46, // 0 "AIFF"
+ 0x00, 0x00, 0x00, 0x00, // 4 wavSize
+ 0x57, 0x41, 0x56, 0x45, // 8 "WAVE"
+ 0x66, 0x6d, 0x74, 0x20, // 12 "fmt "
+ 0x10, 0x00, 0x00, 0x00, // 16
+ 0x01, 0x00, 0x02, 0x00, // 20
+ 0x44, 0xac, 0x00, 0x00, // 24
+ 0x10, 0xb1, 0x02, 0x00, // 28
+ 0x04, 0x00, 0x10, 0x00, // 32
+ 0x64, 0x61, 0x74, 0x61, // 36 "data"
+ 0x00, 0x00, 0x00, 0x00 // 40 byteCount
+ };
+
+ long wavSize = _file->size() - 8;
+ write32( riffHeader, wavSize, 4 );
+
+ write16( riffHeader, channels(), 22 );
+ write32( riffHeader, samplingRate(), 24 );
+ write16( riffHeader, bits(), 34 );
+
+ long byteCount = wavSize - 44;
+ write32( riffHeader, byteCount, 40 );
+
+ _file->at( 0 );
+ _file->writeBlock( riffHeader, 44 );
+ _file->at( _file->size() );
+
+ _file->close();
+ delete _file;
+ _file = 0;
+
+ return true;
+ } else return false;
+}
+
+// vim:sw=4:ts=4