summaryrefslogtreecommitdiff
path: root/core/applets/vmemo/vmemo.cpp
Side-by-side diff
Diffstat (limited to 'core/applets/vmemo/vmemo.cpp') (more/less context) (show whitespace changes)
-rw-r--r--core/applets/vmemo/vmemo.cpp134
1 files changed, 50 insertions, 84 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;
}
+ 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);
@@ -390,14 +396,12 @@ bool VMemo::startRecording() {
l.setFile(fileName);
l.setName(dlName);
l.setType("audio/x-wav");
l.setCategories(cats);
l.writeLink();
- record();
-
return TRUE;
}
void VMemo::stopRecording() {
show();
qDebug("Stopped recording");
@@ -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,12 +483,15 @@ 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;
+ 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;
@@ -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) {
+ if(useADPCM)
+ result = read( dsp, sbuf, bufsize); // 8192
+ else
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];
- }
-
- 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);
+ if( result <= 0) {
+ perror("recording error ");
+// qDebug(currentFileName);
+ QMessageBox::message(tr("Note"),tr("error recording"));
+ recording=FALSE;;
+ break;
}
- } else { //AFMT_U8
- // 8bit unsigned
- unsigned short sound[1024], monoBuffer[1024];
- while(recording) {
- result = read(dsp, sound, 1024); // 8192
- // int j=0;
-
- // if(systemZaurus) {
+ if(useADPCM) {
+ adpcm_coder( sbuf, abuf, result/2, &encoder_state);
+ bytesWritten = ::write(wav, abuf, result/4);
+ } else {
for (int i = 0; i < result; i++) { //since Z is mono do normally
monoBuffer[i] = sound[i];
}
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);