Diffstat (limited to 'core/applets/vmemo/vmemo.cpp') (more/less context) (ignore whitespace changes)
-rw-r--r-- | core/applets/vmemo/vmemo.cpp | 150 |
1 files changed, 58 insertions, 92 deletions
diff --git a/core/applets/vmemo/vmemo.cpp b/core/applets/vmemo/vmemo.cpp index b77e3b8..b5239eb 100644 --- a/core/applets/vmemo/vmemo.cpp +++ b/core/applets/vmemo/vmemo.cpp @@ -11,12 +11,16 @@ ************************************************************************************/ // copyright 2002 Jeremy Cowgar <jc@cowgar.com> /* * $Id$ */ // Sun 03-17-2002 L.J.Potter <ljp@llornkcor.com> +extern "C" { +#include "adpcm.h" +} + #include <sys/utsname.h> #include <sys/time.h> #include <sys/types.h> #include <unistd.h> #include <stdio.h> #include <sys/stat.h> @@ -54,12 +58,19 @@ typedef struct _waveheader { #define FMT 0x20746D66 #define DATA 0x61746164 #define PCM_CODE 1 #define WAVE_MONO 1 #define WAVE_STEREO 2 +struct adpcm_state encoder_state; +//struct adpcm_state decoder_state; + +#define WAVE_FORMAT_DVI_ADPCM (0x0011) +#define WAVE_FORMAT_PCM (0x0001) + + #include "vmemo.h" #include <qpe/qpeapplication.h> #include <qpe/resource.h> #include <qpe/config.h> @@ -193,14 +204,13 @@ static char * vmemo_xpm[] = { " @.#.$.%.&. ", " *.B =. ", " n n n n n n n n n "}; VMemo::VMemo( QWidget *parent, const char *_name ) - : QWidget( parent, _name ) -{ + : QWidget( parent, _name ) { setFixedHeight( 18 ); setFixedWidth( 14 ); recording = FALSE; t_timer = new QTimer( this ); @@ -210,12 +220,13 @@ VMemo::VMemo( QWidget *parent, const char *_name ) if (uname(&name) != -1) { QString release=name.release; Config vmCfg("Vmemo"); vmCfg.setGroup("Defaults"); int toggleKey = setToggleButton(vmCfg.readNumEntry("toggleKey", -1)); + useADPCM = vmCfg.readBoolEntry("use_ADPCM", 0); qDebug("toggleKey %d", toggleKey); if(release.find("embedix",0,TRUE) !=-1) systemZaurus=TRUE; else @@ -240,18 +251,16 @@ VMemo::VMemo( QWidget *parent, const char *_name ) usingIcon=FALSE; if( vmCfg.readNumEntry("hideIcon",0) == 1) hide(); } } -VMemo::~VMemo() -{ +VMemo::~VMemo() { } -void VMemo::receive( const QCString &msg, const QByteArray &data ) -{ +void VMemo::receive( const QCString &msg, const QByteArray &data ) { qDebug("receive"); QDataStream stream( data, IO_ReadOnly ); if (msg == "toggleRecord()") { if (recording) { fromToggle = TRUE; mouseReleaseEvent(NULL); @@ -261,40 +270,36 @@ void VMemo::receive( const QCString &msg, const QByteArray &data ) // mousePressEvent(NULL); startRecording(); } } } -void VMemo::paintEvent( QPaintEvent* ) -{ +void VMemo::paintEvent( QPaintEvent* ) { QPainter p(this); p.drawPixmap( 0, 1,( const char** ) vmemo_xpm ); } -void VMemo::mousePressEvent( QMouseEvent * me) -{ +void VMemo::mousePressEvent( QMouseEvent * me) { // just to be safe if (recording) { recording = FALSE; return; } /* No mousePress/mouseRelease recording on the iPAQ. The REC button on the iPAQ calls these functions mousePressEvent and mouseReleaseEvent with a NULL parameter. */ - if ( me->button() != LeftButton) - + if ( me->button() != LeftButton || me != NULL) // if (!systemZaurus && me != NULL) return; if(!recording) startRecording(); else stopRecording(); } -void VMemo::mouseReleaseEvent( QMouseEvent * ) -{ +void VMemo::mouseReleaseEvent( QMouseEvent * ) { // if(usingIcon && !recording) // stopRecording(); } bool VMemo::startRecording() { @@ -372,15 +377,16 @@ bool VMemo::startRecording() { QString err("Could not open the temp file\n"); err += fileName; QMessageBox::critical(0, "vmemo", err, "Abort"); ::close(dsp); return FALSE; } - QString cmd; - cmd.sprintf("mv %s "+fileName,pointer); + record(); + QString cmd; + cmd.sprintf("mv %s "+fileName, pointer); // move tmp file to regular file here system(cmd.latin1()); QArray<int> cats(1); cats[0] = config.readNumEntry("Category", 0); @@ -389,14 +395,12 @@ bool VMemo::startRecording() { DocLnk l; l.setFile(fileName); l.setName(dlName); l.setType("audio/x-wav"); l.setCategories(cats); l.writeLink(); - - record(); return TRUE; } void VMemo::stopRecording() { show(); @@ -411,14 +415,13 @@ void VMemo::stopRecording() { Config cfg("Vmemo"); cfg.setGroup("Defaults"); if( cfg.readNumEntry("hideIcon",0) == 1 ) hide(); } -int VMemo::openDSP() -{ +int VMemo::openDSP() { Config cfg("Vmemo"); cfg.setGroup("Record"); speed = cfg.readNumEntry("SampleRate", 22050); channels = cfg.readNumEntry("Stereo", 1) ? 2 : 1; // 1 = stereo(2), 0 = mono(1) if (cfg.readNumEntry("SixteenBit", 1)==1) { @@ -464,14 +467,13 @@ int VMemo::openDSP() QCopEnvelope( "QPE/System", "volumeChange(bool)" ) << FALSE; //mute return 1; } -int VMemo::openWAV(const char *filename) -{ +int VMemo::openWAV(const char *filename) { track.setName(filename); if(!track.open(IO_WriteOnly|IO_Truncate|IO_Raw)) { errorMsg=filename; return -1; } @@ -481,13 +483,16 @@ int VMemo::openWAV(const char *filename) wh.main_chunk = RIFF; wh.length=0; wh.chunk_type = WAVE; wh.sub_chunk = FMT; wh.sc_len = 16; - wh.format = PCM_CODE; + if(useADPCM) + wh.format = WAVE_FORMAT_DVI_ADPCM;//PCM_CODE; + else + wh.format = PCM_CODE; wh.modus = channels; wh.sample_fq = speed; wh.byte_p_sec = speed * channels * resolution/8; wh.byte_p_spl = channels * (resolution / 8); wh.bit_p_spl = resolution; wh.data_chunk = DATA; @@ -496,114 +501,75 @@ int VMemo::openWAV(const char *filename) // , wh.modus, wh.sample_fq, wh.byte_p_sec, wh.byte_p_spl, wh.bit_p_spl ); write (wav, &wh, sizeof(WaveHeader)); return 1; } -void VMemo::record(void) -{ +void VMemo::record(void) { int length=0, result, value; QString msg; msg.sprintf("Recording format %d", format); qDebug(msg); Config config("Vmemo"); config.setGroup("Record"); int sRate=config.readNumEntry("SizeLimit", 30); t_timer->start( sRate * 1000+1000, TRUE); - if(systemZaurus) { +// if(systemZaurus) { +// } else { // 16 bit only capabilities - msg.sprintf("Recording format zaurus"); + msg.sprintf("Recording format other"); qDebug(msg); - signed short sound[1024], monoBuffer[1024]; - - if(format==AFMT_S16_LE) { + int bufsize=1024; + int bytesWritten=0; + signed short sound[1024], monoBuffer[1024]; + char abuf[bufsize/2]; + short sbuf[bufsize]; + while(recording) { - while(recording) { - - result = read(dsp, sound, 1024); // 8192 - // int j=0; - - for (int i = 0; i < result; i++) { //since Z is mono do normally - monoBuffer[i] = sound[i]; + if(useADPCM) + result = read( dsp, sbuf, bufsize); // 8192 + else + result = read(dsp, sound, 1024); // 8192 + if( result <= 0) { + perror("recording error "); +// qDebug(currentFileName); + QMessageBox::message(tr("Note"),tr("error recording")); + recording=FALSE;; + break; } - length+=write(wav, monoBuffer, result); - if(length<0) - recording=false; - // for (int i = 0; i < result; i+=2) { - // monoBuffer[j] = sound[i]; - // // monoBuffer[j] = (sound[i]+sound[i+1])/2; - - // j++; - // } - qApp->processEvents(); - // printf("%d\r",length); - // fflush(stdout); - } - - } else { //AFMT_U8 - // 8bit unsigned - unsigned short sound[1024], monoBuffer[1024]; - while(recording) { - result = read(dsp, sound, 1024); // 8192 - // int j=0; + if(useADPCM) { + adpcm_coder( sbuf, abuf, result/2, &encoder_state); + bytesWritten = ::write(wav, abuf, result/4); - // if(systemZaurus) { + } else { + for (int i = 0; i < result; i++) { //since Z is mono do normally + monoBuffer[i] = sound[i]; + } - for (int i = 0; i < result; i++) { //since Z is mono do normally - monoBuffer[i] = sound[i]; + length+=write(wav, monoBuffer, result); } - - length+=write(wav, monoBuffer, result); - - // for (int i = 0; i < result; i+=2) { - // monoBuffer[j] = (sound[i]+sound[i+1])/2; - // j++; - // } - // length+=write(wav, monoBuffer, result/2); - length += result; - // printf("%d\r",length); - // fflush(stdout); - } - - qApp->processEvents(); - } - - } else { // 16 bit only capabilities - - - msg.sprintf("Recording format other"); - qDebug(msg); - - signed short sound[1024];//, monoBuffer[512]; - - while(recording) { - - result = read(dsp, sound, 1024); // 8192 - - write(wav, sound, result); - length += result; + length +=bytesWritten; if(length<0) { - recording=false; perror("dev/dsp's is a lookin' messy"); QMessageBox::message("Vmemo"," Done1 recording\n"+ fileName); } // printf("%d\r",length); // fflush(stdout); qApp->processEvents(); } // qDebug("file has length of %d lasting %d seconds", // length, (( length / speed) / channels) / 2 ); // medialplayer states wrong length in secs - } + // } //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<<<// value = length+36; lseek(wav, 4, SEEK_SET); |